Типы матриц и векторов

Вектор — это одномерный массив вещественного или комплексного типа, а матрица — двумерный массив вещественного или комплексного типа. Таким образом, перечень допустимых числовых типов для элементов этих объектов включает double (считается типом по умолчанию), float и complex.

C точки зрения линейной алгебры (но не компилятора!) простое число также является минимальным вектором, а вектор, в свою очередь, можно рассматривать, как частный случай матрицы.

Вектор, в зависимости от типа элементов, описывается с помощью одного из ключевых слов vector (с суффиксом или без):

  • vector — вектор с элементами типа double;
  • vectorf — вектор с элементами типа float;
  • vectorc — вектор с элементами типа complex.

Хотя векторы бывают вертикальными и горизонтальными, в MQL5 подобное разделение не делается. Необходимая ориентация вектора определяется (подразумевается) местом вектора в выражении.

Над векторами определены операции сложения и умножения, а также введено понятие "Норма" (и соответствующий метод Norm) для получения длины или модуля вектора.

Матрицу можно представить как массив, где первый индекс означает номер строки, а второй индекс — номер столбца. Однако нумерация строк и столбцов, в отличие от линейной алгебры, начинается с нуля, как и в массивах.

Матрица

Две размерности матриц называются также осями (axes) и нумеруются следующим образом: 0 — горизонтальная ось (вдоль строк), 1 — вертикальная ось (вдоль столбцов). Номера осей используются во многих матричных функциях. В частности, когда мы будем говорить о разбиении матрицы на фрагменты, то разбиение по горизонтали означает "разрез" между (или, если угодно, вдоль) строк, а разбиение по вертикали — разрез между столбцов.

В зависимости от типа элементов, матрица описывается с помощью одного из ключевых слова matrix (с суффиксом или без):

  • matrix — матрица с элементами типа double;
  • matrixf — матрица с элементами типа float;
  • matrixc — матрица с элементами типа complex.

Для применения в шаблонных функциях можно использовать запись matrix<double>, matrix<float>, matrix<complex>, vector<double>, vector<float>, vector<complex> вместо соответствующих типов.

vectorf v_f1 = {0123,};
vector<floatv_f2 = v_f1;
matrix m = {{01}, {23}};
 
void OnStart()
{
   Print(v_f2);
   Print(m);
}

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

[0,1,2,3]
[[0,1]
 [2,3]]

Для матрицы определены следующие алгебраические операции:

  • сложение матриц, имеющих одинаковый размер;
  • умножение матриц подходящего размера, при этом число столбцов матрицы слева должно соответствовать числу строк матрицы справа;
  • умножение матрицы на вектор-столбец и умножение вектора-строки на матрицу по правилу матричного умножения (вектор является в этом смысле частным случаем матрицы);
  • умножение матрицы на число.

Кроме того, типы matrix и vector имеют встроенные методы, которые соответствуют аналогам библиотеки NumPy (популярный пакет для машинного обучения на Python), поэтому вы можете получить дополнительные подсказки в документации и примерах для этой библиотеки. Полный перечень методов можно найти в соответствующем разделе справки по MQL5.

К сожалению, в MQL5 не предусмотрено приведение матриц и векторов одного типа к другому (например, от double к float). Кроме того, вектор автоматически не трактуется компилятором как матрица (с одним столбцом или строкой) в тех выражениях, где ожидается матрица. То есть, принципы наследования (характерные для ООП) между матрицами и векторами не существуют, несмотря на кажущуюся родственную связь между этими "структурами".