Манипуляции над матрицами и векторами

При работе с матрицами и векторами доступны базовые манипуляции без проведения каких-либо вычислений. В начале списка приведены исключительно матричные методы, а четыре последних также применимы и для векторов.

  • Transpose — транспонирование матрицы;
  • Col, Row, Diag — извлечение и установка строк, столбцов и диагоналей по номеру;
  • TriL, TriU — получение нижней и верхней треугольной матрицы по номеру диагонали;
  • SwapCols, SwapRows — перестановка местами указанных по номерам строк и столбцов;
  • Flat — установка и получение элемента матрицы по сквозному индексу;
  • Reshape — изменение формы матрицы "по месту";
  • Split, Hsplit, Vsplit — разделение матрицы на несколько подматриц;
  • Resize — изменение размера матрицы и вектора "по месту";
  • Compare, CompareByDigits — сравнение двух матриц или двух векторов с заданной точностью вещественных чисел;
  • Sort — сортировка "по месту" (перестановка элементов) и через получение вектора или матрицы индексов;
  • Clip — ограничение диапазона значений элементов "по месту".

Обратите внимание, что разделение вектора не предусмотрено.

Ниже представлены прототипы методов для матриц.

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)

Для векторов — набор методов поменьше.

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)

Пример транспонирования матрицы:

matrix a = {{012}, {345}};
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]]
*/

Несколько примеров установки разных диагоналей методом Diag:

vector v1 = {123};
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(v11);
Print("m3\n"m3);
/*
   m3
   [[0,1,0,0]
    [0,0,2,0]
    [0,0,0,3]]
*/

Изменение конфигурации матрицы методом Reshape:

matrix matrix_a = {{123}, {456}, {789}, {101112}};
Print("matrix_a\n"matrix_a);
/*
   matrix_a
   [[1,2,3]
    [4,5,6]
    [7,8,9]
    [10,11,12]]
*/
  
matrix_a.Reshape(26);
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(35);
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(24);
Print("Reshape(2,4)\n"matrix_a);
/*
   Reshape(2,4)
   [[1,2,3,4]
    [5,6,7,8]]
*/

Разделение матриц на подматрицы мы применим в примере в разделе о Решении уравнений.

Методы Col и Row позволяют не только получать столбцы или строки матрицы по их номеру, но и вставлять их "по месту" в ранее определенные матрицы. При этом не меняются ни размеры матрицы, ни значения элементов за пределами вектора-столбца (для случая Col) или вектора-строки (для случая Row).

Если же любой из этих двух методов применяется к матрице, размеры которой еще не установлены, то будет создана нулевая матрица размером [N * M], где N и M определяются по-разному для Col и Row, исходя из длины вектора и заданного индекса столбца или строки:

  • в случае Col, N — это длина вектора-столбца, а M — на 1 больше заданного индекса вставляемого столбца;
  • в случае Row, N — на 1 больше заданного индекса вставляемой строки, а M — длина вектора-строки;  

На момент написания данной главы в MQL5 не предусмотрено методов для полноценной вставки строк и столбцов с раздвиганием последующих элементов, а также исключение заданных строк и столбцов.