复制矩阵、向量和数组

要复制矩阵和向量,最简单最常见的方法是使用赋值运算符 '='。

matrix a = {{22}, {33}, {44}};
matrix b = a + 2;
matrix c;
Print("matrix a \n"a);
Print("matrix b \n"b);
c.Assign(b);
Print("matrix c \n"c);

该代码段生成以下日志条目:

matrix a
[[2,2]
 [3,3]
 [4,4]]
matrix b
[[4,4]
 [5,5]
 [6,6]]
matrix c
[[4,4]
 [5,5]
 [6,6]]

CopyAssign 方法也可用于复制矩阵和向量。Assign Copy 的区别在于,Assign 不仅允许复制矩阵,也可以复制数组。

bool matrix<T>::Copy(const matrix<T> &source)

bool matrix<T>::Assign(const matrix<T> &source)

bool matrix<T>::Assign(const T &array[])

类似方法和原型也对向量可用。

通过 Assign,能够将一个向量写入到矩阵:结果将为一行矩阵。

bool matrix<T>::Assign(const vector<T> &v)

你也可以将一个矩阵指派给一个向量:其将为未包装,即矩阵的所有行将排为一行(等效于调用 Flat 方法)。

bool vector<T>::Assign(const matrix<T> &m)

截止本章撰稿时,MQL5 中没有用于将矩阵或向量导出到数组的方法,虽然有用于“转移”数据的机制(详见 Swap 方法)。

下面的例子显示了整数数组 int_arr 如何被复制到 double 类型的矩阵。在此情况下,生成的矩阵自动调整为复制数组的大小。

matrix double_matrix = matrix::Full(2103.14);
Print("double_matrix before Assign() \n"double_matrix);
int int_arr[5][5] = {{12}, {34}, {56}};
Print("int_arr: ");
ArrayPrint(int_arr);
double_matrix.Assign(int_arr);
Print("double_matrix after Assign(int_arr) \n"double_matrix);

我们在日志中获得以下输出。

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]]

因此,Assign 方法可用于从数组切换到矩阵,并自动调整大小和转换类型。

一种更高效的在矩阵、向量和数组之间转移数据的方法是使用 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[])

它们的工作方式类似于 ArraySwap:在两个对象内有数据的缓冲区内部指针被交换。结果,矩阵或向量的元素在源对象中消失而出现在接收数组中,或者反过来,它们从数组移动到矩阵或向量。

Swap 方法可以处理动态数组,包括多维数组。对于多维数组 (array[][N1][N2]...) 的最高维的恒定大小,需满足以下条件:这些维度的乘积必须是矩阵或向量的大小的倍数。这样,一个 [][2][3] 数组被重新分布在 6 个元素的块中。因此,它与大小为 6、12、18(以此类推)的矩阵和向量可互换。