Thao tác với ma trận và vector
Khi làm việc với ma trận và vector, các thao tác cơ bản có sẵn mà không cần bất kỳ tính toán nào. Các phương thức chỉ dành riêng cho ma trận được liệt kê ở đầu danh sách, trong khi bốn phương thức cuối cùng cũng áp dụng được cho vector.
Transpose
: chuyển vị ma trậnCol, Row, Diag
: trích xuất và thiết lập các hàng, cột và đường chéo theo sốTriL, TriU
: lấy ma trận tam giác dưới và tam giác trên theo số của đường chéoSwapCols, SwapRows
: sắp xếp lại các hàng và cột được chỉ định bởi sốFlat
: thiết lập và lấy một phần tử ma trận bằng chỉ số xuyên suốtReshape
: định hình lại ma trận "tại chỗ"Split, Hsplit, Vsplit
: chia ma trận thành nhiều ma trận conresize
: thay đổi kích thước ma trận hoặc vector "tại chỗ"Compare, CompareByDigits
: so sánh hai ma trận hoặc hai vector với độ chính xác nhất định của số thựcSort
: sắp xếp "tại chỗ" (hoán vị các phần tử) và bằng cách lấy một vector hoặc ma trận chứa các chỉ sốclip
: giới hạn phạm vi giá trị của các phần tử "tại chỗ"
Lưu ý rằng việc chia vector không được cung cấp.
Dưới đây là các nguyên mẫu phương thức cho ma trận.
matrix<T> matrix<T>::Transpose()
vector matrix<T>::Col∫Row(const ulong n)
void matrix<T>::Col∫Row(const vector v, const ulong n)
vector matrix<T>::Diag(const int n = 0)
void matrix<T>::Diag(const vector v, const int n = 0)
matrix<T> matrix<T>::TriL∫TriU(const int n = 0)
bool matrix<T>::SwapCols∫SwapRows(const ulong n1, const ulong n2)
T matrix<T>::Flat(const ulong i)
bool matrix<T>::Flat(const ulong i, const T value)
bool matrix<T>::Resize(const ulong rows, const ulong cols, const ulong reserve = 0)
void matrix<T>::Reshape(const ulong rows, const ulong cols)
ulong matrix<T>::Compare(const matrix<T> &m, const T epsilon)
ulong matrix<T>::CompareByDigits(const matrix &m, const int digits)
bool matrix<T>::Split(const ulong nparts, const int axis, matrix<T> &splitted[])
void matrix<T>::Split(const ulong &parts[], const int axis, matrix<T> &splitted[])
bool matrix<T>::Hsplit∫Vsplit(const ulong nparts, matrix<T> &splitted[])
void matrix<T>::Hsplit∫Vsplit(const ulong &parts[], matrix<T> &splitted[])
void matrix<T>::Sort(func_reference compare = NULL, T context)
void matrix<T>::Sort(const int axis, func_reference compare = NULL, T context)
matrix<T> matrix<T>::Sort(func_reference compare = NULL, T context)
matrix<T> matrix<T>::Sort(const int axis, func_reference compare = NULL, T context)
bool matrix<T>::Clip(const T min, const T max)
Đối với vector, có một tập hợp phương thức nhỏ hơn.
bool vector<T>::Resize(const ulong size, const ulong reserve = 0)
ulong vector<T>::Compare(const vector<T> &v, const T epsilon)
ulong vector<T>::CompareByDigits(const vector<T> &v, const int digits)
void vector<T>::Sort(func_reference compare = NULL, T context)
vector vector<T>::Sort(func_reference compare = NULL, T context)
bool vector<T>::Clip(const T min, const T max)
Ví dụ về chuyển vị ma trận:
matrix a = {{0, 1, 2}, {3, 4, 5}};
Print("matrix a \n", a);
Print("a.Transpose() \n", a.Transpose());
/*
matrix a
[[0,1,2]
[3,4,5]]
a.Transpose()
[[0,3]
[1,4]
[2,5]]
*/
2
3
4
5
6
7
8
9
10
11
12
Một số ví dụ về việc thiết lập các đường chéo khác nhau bằng phương thức Diag
:
vector v1 = {1, 2, 3};
matrix m1;
m1.Diag(v1);
Print("m1\n", m1);
/*
m1
[[1,0,0]
[0,2,0]
[0,0,3]]
*/
matrix m2;
m2.Diag(v1, -1);
Print("m2\n", m2);
/*
m2
[[0,0,0]
[1,0,0]
[0,2,0]
[0,0,3]]
*/
matrix m3;
m3.Diag(v1, 1);
Print("m3\n", m3);
/*
m3
[[0,1,0,0]
[0,0,2,0]
[0,0,0,3]]
*/
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
Thay đổi cấu hình ma trận bằng Reshape
:
matrix matrix_a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
Print("matrix_a\n", matrix_a);
/*
matrix_a
[[1,2,3]
[4,5,6]
[7,8,9]
[10,11,12]]
*/
matrix_a.Reshape(2, 6);
Print("Reshape(2,6)\n", matrix_a);
/*
Reshape(2,6)
[[1,2,3,4,5,6]
[7,8,9,10,11,12]]
*/
matrix_a.Reshape(3, 5);
Print("Reshape(3,5)\n", matrix_a);
/*
Reshape(3,5)
[[1,2,3,4,5]
[6,7,8,9,10]
[11,12,0,3,0]]
*/
matrix_a.Reshape(2, 4);
Print("Reshape(2,4)\n", matrix_a);
/*
Reshape(2,4)
[[1,2,3,4]
[5,6,7,8]]
*/
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
34
Chúng ta sẽ áp dụng việc chia ma trận thành các ma trận con trong một ví dụ khi Giải phương trình.
Các phương thức Col
và Row
không chỉ cho phép lấy các cột hoặc hàng của ma trận theo số của chúng mà còn chèn chúng "tại chỗ" vào các ma trận đã được định nghĩa trước đó. Trong trường hợp này, cả kích thước của ma trận lẫn giá trị của các phần tử bên ngoài vector cột (đối với trường hợp Col
) hoặc vector hàng (đối với trường hợp Row
) sẽ không thay đổi.
Nếu một trong hai phương thức này được áp dụng cho một ma trận mà kích thước chưa được thiết lập, thì một ma trận rỗng có kích thước [N * M] sẽ được tạo ra, trong đó N và M được định nghĩa khác nhau cho Col
và Row
, dựa trên độ dài của vector và chỉ số cột hoặc hàng được chỉ định:
- Đối với
Col
, N là độ dài của vector cột và M lớn hơn 1 so với chỉ số được chỉ định của cột được chèn - Đối với
Row
, N lớn hơn 1 so với chỉ số được chỉ định của hàng được chèn và M là độ dài của vector hàng
Tại thời điểm viết chương này, MQL5 không cung cấp các phương thức để chèn đầy đủ các hàng và cột với việc mở rộng các phần tử tiếp theo, cũng như để loại bỏ các hàng và cột được chỉ định.