Norm

返回矩阵或向量的范数。

double vector::Norm(

  const ENUM_VECTOR_NORM  norm,     // 向量范数

  const int                        norm_p=2  // p-范数,如果是 VECTOR_NORM_P

   );



double matrix::Norm(

  const ENUM_MATRIX_NORM  norm      // 矩阵范数

   );

 

参数

范数

[输入] 范数顺序

返回值

矩阵或向量的范数。

注意

  • VECTOR_NORM_INF 是向量元素中的最大绝对值。
  • VECTOR_NORM_MINUS_INF 是向量元素中的最小绝对值。
  • VECTOR_NORM_P 是向量的 P-范数。 如果 norm_p=0,那么这是非零向量元素的数量。 norm_p=1 是矢量元素绝对值的总和。 norm_p=2 是向量元素值平方和的平方根。 P-范数可以为负值。
  • MATRIX_NORM_FROBENIUS 是矩阵元素值的平方和的平方根。 弗罗贝尼乌斯(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 是矩阵的最低奇异值。

以 MQL5 实现的计算向量 P-范数的简单算法:

double VectorNormP(const vector& v,int norm_value)

  {

   ulong  i;

   double norm=0.0;

//---

   switch(norm_value)

     {

      case 0 :

         for(i=0; i<v.Size(); i++)

            if(v[i]!=0)

               norm+=1.0;

         break;

      case 1 :

         for(i=0; i<v.Size(); i++)

            norm+=MathAbs(v[i]);

         break;

      case 2 :

         for(i=0; i<v.Size(); i++)

            norm+=v[i]*v[i];

         norm=MathSqrt(norm);

         break;

      default :

         for(i=0; i<v.Size(); i++)

            norm+=MathPow(MathAbs(v[i]),norm_value);

         norm=MathPow(norm,1.0/norm_value);

     }

//---

   return(norm);

  }

MQL5 示例:

  matrix a= {{0, 1, 2, 3, 4, 5, 6, 7, 8}};

  a=a-4;

  Print("matrix a \n", a);

  a.Reshape(3, 3);

  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((3, 3))

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(b, np.inf))

print("LA.norm(b, -np.inf)=",LA.norm(b, -np.inf))

print("LA.norm(b, 1)=",LA.norm(b, 1))

print("LA.norm(b, -1)=",LA.norm(b, -1))

print("LA.norm(b, 2)=",LA.norm(b, 2))

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(b, np.inf)= 9.0

LA.norm(b, -np.inf)= 2.0

LA.norm(b, 1)= 7.0

LA.norm(b, -1)= 6.0

LA.norm(b, 2)= 7.3484692283495345

LA.norm(b, -2)= 1.857033188519056e-16