Tích của ma trận và vector
Phép nhân ma trận là một trong những phép toán cơ bản trong nhiều phương pháp số học. Ví dụ, nó thường được sử dụng khi triển khai các phương pháp lan truyền thuận và ngược trong các lớp mạng nơ-ron.
Các loại tích chập khác nhau cũng có thể được xếp vào danh mục tích ma trận. Nhóm các hàm như vậy trong MQL5 bao gồm:
MatMul
: tích ma trận của hai ma trậnPower
: nâng một ma trận vuông lên lũy thừa nguyên được chỉ địnhInner
: tích trong của hai ma trậnOuter
: tích ngoài của hai ma trận hoặc hai vectorKron
: tích Kronecker của hai ma trận, một ma trận và một vector, một vector và một ma trận, hoặc hai vectorCorrCoef
: tính toán hệ số tương quan Pearson giữa các hàng hoặc cột của một ma trận, hoặc giữa các vectorCov
: tính toán ma trận hiệp phương sai của các hàng hoặc cột của một ma trận, hoặc giữa hai vectorCorrelate
: tính toán tương quan chéo của hai vectorConvolve
: tính toán tích chập tuyến tính rời rạc của hai vectorDot
: tích vô hướng của hai vector
Để cung cấp ý tưởng tổng quát về cách sử dụng các phương thức này, chúng ta sẽ đưa ra các nguyên mẫu của chúng (theo thứ tự: từ ma trận, qua ma trận-vector kết hợp, đến vector).
matrix<T> matrix<T>::MatMul(const matrix<T> &m)
matrix<T> matrix<T>::Power(const int power)
matrix<T> matrix<T>::Inner(const matrix<T> &m)
matrix<T> matrix<T>::Outer(const matrix<T> &m)
matrix<T> matrix<T>::Kron(const matrix<T> &m)
matrix<T> matrix<T>::Kron(const vector<T> &v)
matrix<T> matrix<T>::CorrCoef(const bool rows = true)
matrix<T> matrix<T>::Cov(const bool rows = true)
matrix<T> vector<T>::Cov(const vector<T> &v)
T vector<T>::CorrCoef(const vector<T> &v)
vector<T> vector<T>::Correlate(const vector<T> &v, ENUM_VECTOR_CONVOLVE mode)
vector<T> vector<T>::Convolve(const vector<T> &v, ENUM_VECTOR_CONVOLVE mode)
matrix<T> vector<T>::Outer(const vector<T> &v)
matrix<T> vector<T>::Kron(const matrix<T> &m)
matrix<T> vector<T>::Kron(const vector<T> &v)
T vector<T>::Dot(const vector<T> &v)
Dưới đây là một ví dụ đơn giản về tích ma trận của hai ma trận sử dụng phương thức MatMul
:
matrix a = {{1, 0, 0},
{0, 1, 0}};
matrix b = {{4, 1},
{2, 2},
{1, 3}};
matrix c1 = a.MatMul(b);
matrix c2 = b.MatMul(a);
Print("c1 = \n", c1);
Print("c2 = \n", c2);
/*
c1 =
[[4,1]
[2,2]]
c2 =
[[4,1,0]
[2,2,0]
[1,3,0]]
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Các ma trận dạng A[M,N] * B[N,K] = C[M,K] có thể được nhân với nhau, tức là số cột của ma trận đầu tiên phải bằng số hàng của ma trận thứ hai. Nếu kích thước không phù hợp, kết quả sẽ là một ma trận rỗng.
Khi nhân một ma trận với một vector, có hai tùy chọn được phép:
- Vector ngang (hàng) được nhân với ma trận ở bên phải, độ dài của vector bằng số hàng của ma trận
- Ma trận được nhân với một vector dọc (cột) ở bên phải, độ dài của vector bằng số cột của ma trận
Các vector cũng có thể được nhân với nhau. Trong MatMul
, điều này luôn tương đương với tích vô hướng (phương thức Dot
) của một vector hàng với một vector cột, và tùy chọn khi một vector cột được nhân với một vector hàng để tạo ra một ma trận được hỗ trợ bởi một phương thức khác: Outer
.
Hãy thể hiện tích Outer
của vector v5
với vector v3
, và theo thứ tự ngược lại. Trong cả hai trường hợp, một vector cột được ngụ ý ở bên trái, và một vector hàng được ngụ ý ở bên phải.
vector v3 = {1, 2, 3};
vector v5 = {1, 2, 3, 4, 5};
Print("v5 = \n", v5);
Print("v3 = \n", v3);
Print("v5.Outer(v3) = m[5,3] \n", v5.Outer(v3));
Print("v3.Outer(v5) = m[3,5] \n", v3.Outer(v5));
/*
v5 =
[1,2,3,4,5]
v3 =
[1,2,3]
v5.Outer(v3) = m[5,3]
[[1,2,3]
[2,4,6]
[3,6,9]
[4,8,12]
[5,10,15]]
v3.Outer(v5) = m[3,5]
[[1,2,3,4,5]
[2,4,6,8,10]
[3,6,9,12,15]]
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22