Advertisement
electricmaster

Norm

Nov 19th, 2016
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.75 KB | None | 0 0
  1.         public T Norm(double p) {
  2.             if (M == 1 && N == 1) {
  3.                 if (p < 1) throw new DomainException();
  4.                 else return this[1, 1];
  5.             }
  6.             else if (M == 1 || N == 1) return VectorNorm(p);
  7.             else return MatrixNorm(p);
  8.         }
  9.  
  10.         private T VectorNorm(double p) {
  11.             // shouldn't be  thrown, but either way this is only for vectors. use matrixnorm
  12.             if (M != 1 && N != 1) throw new InvalidDimException();
  13.  
  14.             T ans = (dynamic)0;
  15.  
  16.             if (p >= 1 && !double.IsInfinity(p)) {
  17.                 if (N == 1)
  18.                     for (int i = 1; i <= M; i++)
  19.                         ans += (dynamic)Pow(Abs((dynamic)this[i, 1]), p);
  20.                 if (M == 1)
  21.                     for (int j = 1; j <= N; j++)
  22.                         ans += (dynamic)Pow(Abs((dynamic)this[1, j]), p);
  23.                 return Pow((dynamic)ans, 1 / p);
  24.             } // p = positive int
  25.             else if (p == double.PositiveInfinity) {
  26.                 T[] terms = new T[(int)max(M, N)];
  27.  
  28.                 if (N == 1)
  29.                     for (int i = 1; i <= M; i++)
  30.                         terms[i - 1] = Abs((dynamic)this[i, 1]);
  31.                 if (M == 1)
  32.                     for (int j = 1; j <= N; j++)
  33.                         terms[j - 1] = Abs((dynamic)this[1, j]);
  34.                 return max((dynamic)terms);
  35.             }
  36.             else if (p == double.NegativeInfinity) {
  37.                 T[] terms = new T[(int)max(M, N)];
  38.  
  39.                 if (N == 1)
  40.                     for (int i = 1; i <= M; i++)
  41.                         terms[i - 1] = Abs((dynamic)this[i, 1]);
  42.                 if (M == 1)
  43.                     for (int j = 1; j <= N; j++)
  44.                         terms[j - 1] = Abs((dynamic)this[1, j]);
  45.                 return min((dynamic)terms);
  46.             }
  47.             else throw new DomainException(); // p is not +/-inf or a positive number
  48.         }
  49.  
  50.         private T MatrixNorm(double p) {
  51.             if (p == 1) {
  52.                 T[] norms = new T[N];
  53.                 for (int j = 1; j <= N; j++)
  54.                     norms[j - 1] = GetColumnVector(j).VectorNorm(1);
  55.                 return max((dynamic)norms);
  56.             }
  57.             else if (p == 2) {
  58.                 Matrix<T> A2 = this^2;
  59.                 T[] eiv = Eigenvalues();
  60.                 return Pow(max((dynamic)eiv), 1/2);
  61.             }
  62.             else if (p == double.PositiveInfinity) {
  63.                 T[] norms = new T[M];
  64.                 for (int i = 1; i <= M; i++)
  65.                     norms[i - 1] = GetRowVector(i).VectorNorm(1);
  66.                 return max((dynamic)norms);
  67.             }
  68.             else throw new DomainException(); // p must be 1, 2, or a +inf
  69.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement