Norm

行列/ベクトルのノルムを返します。

double vector::Norm(
  const ENUM_VECTOR_NORM  norm,     // ベクトルのノルム
  const int                       norm_p=2 // VECTOR_NORM_Pの場合の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は、ベクトル要素値の平方和の平方根です。Pノルムは負になる場合があります。
  • MATRIX_NORM_FROBENIUSは、行列要素値の平方和の平方根です。フロベニウスノルムとベクトルP2ノルムは一致しています。
  • MATRIX_NORM_SPECTRALは、行列スペクトルの最大値です。
  • MATRIX_NORM_NUCLEARは、行列の特異値の合計です。
  • MATRIX_NORM_INFは、行列の垂直ベクトルの中で最大のベクトルP1ノルムです。行列inf-normとベクトルinf-normは一致しています。
  • 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))
 

[-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