Copiar matrices, vectores y arrays

La forma más sencilla y habitual de copiar matrices y vectores es mediante el operador de asignación '='.

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);

Este fragmento genera las siguientes entradas de registro:

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

Los métodos Copy y Assign también pueden utilizarse para copiar matrices y vectores. La diferencia entre Assign y Copy es que Assign permite copiar no sólo matrices, sino también matrices.

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

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

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

También existen métodos y prototipos similares para los vectores.

A través de Assign es posible escribir un vector en una matriz: el resultado será una matriz de una fila.

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

También puede asignar una matriz a un vector: se desenvolverá, es decir, todas las filas de la matriz se alinearán en una fila (equivalente a llamar al método Flat ).

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

En el momento de escribir este capítulo, no había ningún método en MQL5 para exportar una matriz o vector a un array, aunque existe un mecanismo para «transferir» los datos (véase el método Swap).

En el siguiente ejemplo se muestra cómo se copia un array de enteros int_arr en una matriz de tipo double. En este caso, la matriz resultante se ajusta automáticamente al tamaño del array copiado.

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);

Tenemos la siguiente salida en el registro:

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

Así, el método Assign puede utilizarse para pasar de arrays a matrices con conversión automática de tamaño y tipo.

Una forma más eficaz (rápida y sin necesidad de copiar) de transferir datos entre matrices, vectores y arrays es utilizar los métodos 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[])

Funcionan de forma similar a ArraySwap: los punteros internos a búferes con datos dentro de dos objetos se intercambian. Como resultado, los elementos de una matriz o vector desaparecen en el objeto de origen y aparecen en el array receptor, o viceversa: pasan del array a la matriz o vector.

El método Swap permite trabajar con arrays dinámicos, incluidos los multidimensionales. Se aplica una determinada condición a los tamaños constantes de las dimensiones más altas de un array multidimensional (array[][N1][N2]...): El producto de estas dimensiones debe ser múltiplo del tamaño de la matriz o del vector. Así, un array de [][2][3] se redistribuye en bloques de 6 elementos. Por lo tanto, es intercambiable con matrices y vectores de tamaño 6, 12, 18, etc.