Sao chép ma trận, vector và mảng
Cách đơn giản và phổ biến nhất để sao chép ma trận và vector là sử dụng toán tử gán '='.
matrix a = {{2, 2}, {3, 3}, {4, 4}};
matrix b = a + 2;
matrix c;
Print("matrix a \n", a);
Print("matrix b \n", b);
c.Assign(b);
Print("matrix c \n", c);
2
3
4
5
6
7
Đoạn mã này tạo ra các mục nhật ký sau:
matrix a
[[2,2]
[3,3]
[4,4]]
matrix b
[[4,4]
[5,5]
[6,6]]
matrix c
[[4,4]
[5,5]
[6,6]]
2
3
4
5
6
7
8
9
10
11
12
Các phương thức Copy
và Assign
cũng có thể được sử dụng để sao chép ma trận và vector. Sự khác biệt giữa Assign
và Copy
là Assign
cho phép sao chép không chỉ ma trận mà còn cả mảng.
bool matrix<T>::Copy(const matrix<T> &source)
bool matrix<T>::Assign(const matrix<T> &source)
bool matrix<T>::Assign(const T &array[])
Các phương thức và nguyên mẫu tương tự cũng có sẵn cho vector.
Thông qua Assign
, có thể ghi một vector vào một ma trận: kết quả sẽ là một ma trận một hàng.
bool matrix<T>::Assign(const vector<T> &v)
Bạn cũng có thể gán một ma trận cho một vector: nó sẽ được trải ra, tức là tất cả các hàng của ma trận sẽ được xếp thành một hàng (tương đương với việc gọi phương thức Flat).
bool vector<T>::Assign(const matrix<T> &m)
Tại thời điểm viết chương này, MQL5 chưa có phương thức nào để xuất ma trận hoặc vector sang mảng, mặc dù có một cơ chế để "chuyển giao" dữ liệu (xem phương thức Swap
bên dưới).
Ví dụ dưới đây cho thấy cách một mảng số nguyên int_arr
được sao chép vào một ma trận kiểu double
. Trong trường hợp này, ma trận kết quả tự động điều chỉnh theo kích thước của mảng được sao chép.
matrix double_matrix = matrix::Full(2, 10, 3.14);
Print("double_matrix before Assign() \n", double_matrix);
int int_arr[5][5] = {{1, 2}, {3, 4}, {5, 6}};
Print("int_arr: ");
ArrayPrint(int_arr);
double_matrix.Assign(int_arr);
Print("double_matrix after Assign(int_arr) \n", double_matrix);
2
3
4
5
6
7
Chúng ta có đầu ra sau trong nhật ký.
double_matrix before Assign()
[[3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14]
[3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14]]
int_arr:
[,0][,1][,2][,3][,4]
[0,] 1 2 0 0 0
[1,] 3 4 0 0 0
[2,] 5 6 0 0 0
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
double_matrix after Assign(int_arr)
[[1,2,0,0,0]
[3,4,0,0,0]
[5,6,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Vì vậy, phương thức Assign
có thể được sử dụng để chuyển từ mảng sang ma trận với việc chuyển đổi kích thước và kiểu tự động.
Một cách hiệu quả hơn (nhanh và không liên quan đến sao chép) để chuyển dữ liệu giữa ma trận, vector và mảng là sử dụng các phương thức Swap
.
bool matrix<T>::Swap(vector<T> &vec)
bool matrix<T>::Swap(matrix<T> &vec)
bool matrix<T>::Swap(T &arr[])
bool vector<T>::Swap(vector<T> &vec)
bool vector<T>::Swap(matrix<T> &vec)
bool vector<T>::Swap(T &arr[])
Chúng hoạt động tương tự như ArraySwap: Các con trỏ nội bộ đến bộ đệm chứa dữ liệu bên trong hai đối tượng được hoán đổi. Kết quả là, các phần tử của ma trận hoặc vector biến mất trong đối tượng nguồn và xuất hiện trong mảng nhận, hoặc ngược lại, chúng di chuyển từ mảng sang ma trận hoặc vector.
Phương thức Swap
cho phép làm việc với các mảng động, bao gồm cả mảng đa chiều. Một điều kiện nhất định áp dụng cho các kích thước cố định của các chiều cao nhất của mảng đa chiều (array[][N1][N2]...
): Tích của các chiều này phải là bội số của kích thước ma trận hoặc vector. Vì vậy, một mảng [][2][3] được phân phối lại theo các khối 6 phần tử. Do đó, nó có thể hoán đổi với ma trận và vector có kích thước 6, 12, 18, v.v.