复制矩阵、向量和数组
要复制矩阵和向量,最简单最常见的方法是使用赋值运算符 '='。
matrix a = {{2, 2}, {3, 3}, {4, 4}};
|
该代码段生成以下日志条目:
matrix a
|
Copy 和 Assign 方法也可用于复制矩阵和向量。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(2, 10, 3.14);
|
我们在日志中获得以下输出。
double_matrix before Assign()
|
因此,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(以此类推)的矩阵和向量可互换。