Norm
Trả về chuẩn của ma trận hoặc vector.
cpp
double vector::Norm(
const ENUM_VECTOR_NORM norm, // chuẩn vector
const int norm_p=2 // số p của chuẩn p trong trường hợp VECTOR_NORM_P
);
double matrix::Norm(
const ENUM_MATRIX_NORM norm // chuẩn ma trận
);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Tham số
norm
[in] Thứ tự chuẩn
Giá trị trả về
Chuẩn của ma trận hoặc vector.
Ghi chú
VECTOR_NORM_INF
là giá trị tuyệt đối lớn nhất trong các phần tử vector.VECTOR_NORM_MINUS_INF
là giá trị tuyệt đối nhỏ nhất của vector.VECTOR_NORM_P
là chuẩn P của vector. Nếunorm_p=0
, thì đây là số phần tử vector khác 0.norm_p=1
là tổng giá trị tuyệt đối của các phần tử vector.norm_p=2
là căn bậc hai của tổng bình phương các giá trị phần tử vector. Giá trị của tham sốnorm_p
có thể âm.MATRIX_NORM_FROBENIUS
là căn bậc hai của tổng bình phương các giá trị phần tử ma trận. Chuẩn Frobenius và chuẩn P2 của vector là nhất quán.MATRIX_NORM_SPECTRAL
là giá trị lớn nhất của phổ ma trận.MATRIX_NORM_NUCLEAR
là tổng các giá trị kỳ dị của ma trận.MATRIX_NORM_INF
là chuẩn p1 vector lớn nhất trong số các vector dọc của ma trận. Chuẩn inf của ma trận và chuẩn inf của vector là nhất quán.MATRIX_NORM_MINUS_INF
là chuẩn p1 vector nhỏ nhất trong số các vector dọc của ma trận.MATRIX_NORM_P1
là chuẩn p1 vector lớn nhất trong số các vector ngang của ma trận.MATRIX_NORM_MINUS_P1
là chuẩn p1 vector nhỏ nhất trong số các vector ngang của ma trận.MATRIX_NORM_P2
là giá trị kỳ dị lớn nhất của ma trận.MATRIX_NORM_MINUS_P2
là giá trị kỳ dị nhỏ nhất của ma trận.
Thuật toán đơn giản để tính chuẩn P của vector trong MQL5:
cpp
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Ví dụ MQL5:
cpp
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
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Ví dụ Python:
cpp
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29