Norm

Возвращает норму матрицы или вектора.

double vector::Norm(
  const ENUM_VECTOR_NORM  norm,     // норма вектора
  const int                        norm_p=2  // число p-norm в случае VECTOR_NORM_P
   );
 
double matrix::Norm(
  const ENUM_MATRIX_NORM  norm      // норма матрицы
   );
 

Параметры

norm

[in] Порядок нормы

Возвращаемое значение

Норма матрицы или вектора.

Примечание

  • VECTOR_NORM_INF — максимальное абсолютное значение среди элементов вектора.
  • VECTOR_NORM_MINUS_INF — минимальное абсолютное значение вектора.
  • VECTOR_NORM_P — P-норма вектора. Если norm_p=0, то это количество ненулевых элементов вектора; norm_p=1 - сумма абсолютных значений элементов вектора; norm_p=2 - квадратный корень из суммы квадратов значений элементов вектора. Значение параметра norm_p может быть отрицательным.
  • MATRIX_NORM_FROBENIUS — квадратный корень из суммы квадратов значений элементов матрицы. Норма Фробениуса и векторная P2-норма являются согласованными.
  • MATRIX_NORM_SPECTRAL — максимальное значение спектра матрицы.
  • MATRIX_NORM_NUCLEAR — сумма сингулярных значений матрицы.
  • MATRIX_NORM_INF — максимальная векторная p1-норма среди вертикальных векторов матрицы. Матричная inf-норма и векторная inf-норма являются согласованными.
  • MATRIX_NORM_MINUS_INF — минимальная векторная p1-норма среди вертикальных векторов матрицы.
  • MATRIX_NORM_P1 — максимальная векторная p1-норма среди горизонтальных векторов матрицы.
  • MATRIX_NORM_MINUS_P1 — минимальная векторная p1-норма среди горизонтальных векторов матрицы.
  • MATRIX_NORM_P2 — наибольшее сингулярное значение матрицы.
  • MATRIX_NORM_MINUS_P2 — наименьшее сингулярное значение матрицы.

Простой алгоритм расчёта P-нормы вектора на MQL5:

double VectorNormP(const vectorv,int norm_value)
  {
   ulong  i;
   double norm=0.0;
//---
   switch(norm_value)
     {
      case 0 :
         for(i=0i<v.Size(); i++)
            if(v[i]!=0)
               norm+=1.0;
         break;
      case 1 :
         for(i=0i<v.Size(); i++)
            norm+=MathAbs(v[i]);
         break;
      case 2 :
         for(i=0i<v.Size(); i++)
            norm+=v[i]*v[i];
         norm=MathSqrt(norm);
         break;
      default :
         for(i=0i<v.Size(); i++)
            norm+=MathPow(MathAbs(v[i]),norm_value);
         norm=MathPow(norm,1.0/norm_value);
     }
//---
   return(norm);
  }

Пример на MQL5:

  matrix a= {{012345678}};
  a=a-4;
  Print("matrix a \n"a);
  a.Reshape(33);
  matrix b=a;
  Print("matrix b \n"b);
  Print("b.Norm(MATRIX_NORM_P2)="b.Norm(MATRIX_NORM_FROBENIUS));
  Print("b.Norm(MATRIX_NORM_FROBENIUS)="b.Norm(MATRIX_NORM_FROBENIUS));
  Print("b.Norm(MATRIX_NORM_INF)"b.Norm(MATRIX_NORM_INF));
  Print("b.Norm(MATRIX_NORM_MINUS_INF)"b.Norm(MATRIX_NORM_MINUS_INF));
  Print("b.Norm(MATRIX_NORM_P1)=)"b.Norm(MATRIX_NORM_P1));
  Print("b.Norm(MATRIX_NORM_MINUS_P1)="b.Norm(MATRIX_NORM_MINUS_P1));
  Print("b.Norm(MATRIX_NORM_P2)="b.Norm(MATRIX_NORM_P2));
  Print("b.Norm(MATRIX_NORM_MINUS_P2)="b.Norm(MATRIX_NORM_MINUS_P2));
 
  /*
  matrix a
  [[-4,-3,-2,-1,0,1,2,3,4]]
  matrix b
  [[-4,-3,-2]
  [-1,0,1]
  [2,3,4]]
  b.Norm(MATRIX_NORM_P2)=7.745966692414834
  b.Norm(MATRIX_NORM_FROBENIUS)=7.745966692414834
  b.Norm(MATRIX_NORM_INF)9.0
  b.Norm(MATRIX_NORM_MINUS_INF)2.0
  b.Norm(MATRIX_NORM_P1)=)7.0
  b.Norm(MATRIX_NORM_MINUS_P1)=6.0
  b.Norm(MATRIX_NORM_P2)=7.348469228349533
  b.Norm(MATRIX_NORM_MINUS_P2)=1.857033188519056e-16
  */

Пример на Python:

import numpy as np
from numpy import linalg as LA
a = np.arange(9) - 4
print("a \n",a)
b = a.reshape((33))
print("b \n",b)
print("LA.norm(b)=",LA.norm(b))
print("LA.norm(b, 'fro')=",LA.norm(b, 'fro'))
print("LA.norm(b, np.inf)=",LA.norm(bnp.inf))
print("LA.norm(b, -np.inf)=",LA.norm(b, -np.inf))
print("LA.norm(b, 1)=",LA.norm(b1))
print("LA.norm(b, -1)=",LA.norm(b, -1))
print("LA.norm(b, 2)=",LA.norm(b2))
print("LA.norm(b, -2)=",LA.norm(b, -2))
 
a 
 [-4 -3 -2 -1  0  1  2  3  4]
b 
 [[-4 -3 -2]
 [-1  0  1]
 [ 2  3  4]]
LA.norm(b)= 7.745966692414834
LA.norm(b, 'fro')= 7.745966692414834
LA.norm(bnp.inf)= 9.0
LA.norm(b, -np.inf)= 2.0
LA.norm(b1)= 7.0
LA.norm(b, -1)= 6.0
LA.norm(b2)= 7.3484692283495345
LA.norm(b, -2)= 1.857033188519056e-16