Power
Nâng một ma trận vuông lên lũy thừa nguyên.
cpp
matrix matrix::Power(
const int power // lũy thừa
);
1
2
3
2
3
Tham số
power
[in] Số mũ có thể là bất kỳ số nguyên nào, dương, âm hoặc bằng không.
Giá trị trả về
Ma trận.
Ghi chú
Ma trận kết quả có cùng kích thước với ma trận ban đầu. Khi nâng lên lũy thừa 0, ma trận đơn vị được trả về. Lũy thừa dương n nghĩa là ma trận ban đầu được nhân n lần với chính nó. Lũy thừa âm -n nghĩa là ma trận ban đầu được nghịch đảo trước, sau đó ma trận nghịch đảo được nhân với chính nó n lần.
Thuật toán đơn giản để nâng ma trận lên lũy thừa trong MQL5:
cpp
bool MatrixPower(matrix& c, const matrix& a, const int power)
{
//--- ma trận phải là ma trận vuông
if(a.Rows()!=a.Cols())
return(false);
//--- kích thước của ma trận kết quả hoàn toàn giống với ma trận ban đầu
ulong rows=a.Rows();
ulong cols=a.Cols();
matrix result(rows,cols);
//--- khi nâng lên lũy thừa 0, trả về ma trận đơn vị
if(power==0)
result.Identity();
else
{
//--- đối với lũy thừa âm, trước tiên nghịch đảo ma trận
if(power<0)
{
matrix inverted=a.Inv();
result=inverted;
for(int i=-1; i>power; i--)
result=result.MatMul(inverted);
}
else
{
result=a;
for(int i=1; i<power; i++)
result=result.MatMul(a);
}
}
//---
c=result;
return(true);
}
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
32
33
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
32
33
Ví dụ MQL5:
cpp
matrix i= {{0, 1}, {-1, 0}};
Print("i:\n", i);
Print("i.Power(3):\n", i.Power(3));
Print("i.Power(0):\n", i.Power(0));
Print("i.Power(-3):\n", i.Power(-3));
/*
i:
[[0,1]
[-1,0]]
i.Power(3):
[[0,-1]
[1,0]]
i.Power(0):
[[1,0]
[0,1]]
i.Power(-3):
[[0,-1]
[1,0]]
*/
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
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
Ví dụ Python:
cpp
import numpy as np
from numpy.linalg import matrix_power
# ma trận tương đương với đơn vị ảo
i = np.array([[0, 1], [-1, 0]])
print("i:\n", i)
# nên bằng -i
print("matrix_power(i, 3) :\n", matrix_power(i, 3))
print("matrix_power(i, 0):\n", matrix_power(i, 0))
# nên bằng 1/(-i) = i, nhưng với phần tử số thực
print("matrix_power(i, -3):\n", matrix_power(i, -3))
i:
[[ 0 1]
[-1 0]]
matrix_power(i, 3) :
[[ 0 -1]
[ 1 0]]
matrix_power(i, 0):
[[1 0]
[0 1]]
matrix_power(i, -3):
[[ 0. 1.]
[-1. 0.]]
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
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