Матрицы и векторы

vector — это специальный тип данных в MQL5 для работы с векторами, который представляет из себя одномерный массив типа double. Вектор является одним из основополагающих понятий линейной алгебры и активно применяется во многих областях науки — в физике, геометрии и других. Векторы используются при решении систем линейных уравнений, в 3D-графике и т.д. Над векторами определены операции сложения и умножения, а также введено понятие "Норма" для получения длины или расстояния между векторами. В программировании векторы обычно представлены массивами однородных элементов, над которыми может быть не задано обычных векторных операций, то есть массивы нельзя складывать друг с другом, умножать друг на друга, а также нет понятия нормы.

Векторы могут быть представлены как вектор-столбец или как вектор-строка при работе с матрицами. Помимо этого в линейной алгебре для векторов используются такие понятия, как ковариантность и контравариантность. Для целей написания кода на MQL5 эти различия не имеют значения, так как только сам программист решает, что из себя представляет каждый объект типа vector. Например, это может быть вектор поворота, перемещения, сжатия и так далее, если речь идет о 3D-графике.

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

matrix — это еще один специальный тип данных в MQL5 для представления матриц, который фактически является двумерным массивом типа double. Векторы и матрицы введены в язык MQL5 для более простой работы с определенными типами наборов данных. Они дают возможность программистам использовать все преимущества линейной алгебры в наиболее простой и приближенной к математике форме. Матрицы широко применяются в математике для компактной записи систем линейных алгебраических или дифференциальных уравнений. В этом случае количество строк матрицы соответствует числу уравнений, а количество столбцов — количеству неизвестных. В результате решение систем линейных уравнений сводится к операциям над матрицами.

Существуют следующие типы данных:

  • matrix — матрица, содержащая элементы типа double
  • matrixf — матрица, содержащая элементы типа float
  • matrixc — матрица, содержащая элементы типа complex.
  • vector — вектор, содержащий элементы типа double
  • vectorf — вектор, содержащий элементы типа float
  • vectorc — вектор, содержащий элементы типа complex

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

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

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

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

Использование векторов и матриц, а точнее, специальных методов, которыми обладают эти типы данных, позволяет писать более простой, короткий и понятный код, который приближен к математической записи. Это избавляет программиста от необходимости создавать вложенные циклы и помнить о правильной индексации массивов, которые участвуют в вычислении. Таким образом повышается надежность и скорость разработки сложных программ.

 

Список методов, реализованных в matrix и vector

Типы matrix и vector имеют встроенные методы, которые соответствуют аналогам библиотеки NumPy. Это позволит перенести алгоритмы и коды с языка Python на MQL5 с минимальными затратами. Таким образом, множество задач по обработке данных, решению математических уравнений, нейросетям и машинному обучению можно решать с использованием готовых наработок и библиотек языка Python.

Метод matrix/vector

Аналог в NumPy

Описание

void matrix.Eye(const int rows, const int cols, const int ndiag=0)

eye

Создает матрицу с единицами по диагонали и нулями в остальных местах

void matrix.Identity(const int rows)

identity

Создает квадратную матрицу с единицами на главной диагонали

void matrix.Ones(const int rows, const int cols)

ones

Создает новую матрицу по числу строк и столбцов, заполненную единицами

void matrix.Zeros(const int rows, const int cols)

zeros

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

void matrix.Full(const int rows, const int cols, const scalar value)

full

Создает новую матрицу по числу строк и столбцов, заполненную скалярным значением

void matrix.Copy(const matrix a)

void vector.Copy(const vector v)

copy

Создает копию данной матрицы

void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0)

frombuffer

Создает матрицу из одномерного массива

void matrix.FromFile(const int rows, condt int cols, const int file_handle, const int count=-1, const int offset=0)

fromfile

Создает матрицу из данных в текстовом или двоичном файле

void vector.FromString(const string source, const string sep=" ")

fromstring

Создает вектор на основе текстовых данных из строки

void vector.Arange(const scalar start, const scalar stop, const scalar step=1)

arange

Создает вектор с равномерно распределенными значениями в заданном интервале

void matrix.Diag(const vector v, const int ndiag=0)

diag

Извлекает диагональ или создает диагональную матрицу

void matrix.Tri(const int rows, const int cols, const int ndiag=0)

tri

Создает матрицу с единицами на указанной диагонали и ниже и с нулями в остальных местах

void matrix.Tril(const int rows, const int cols, const scalar array[], const int ndiag=0)

tril

Возвращает копию матрицы с обнуленными элементами над k-й диагональю

void matrix.Triu(const int rows, const int cols, const scalar array[], const int ndiag=0)

triu

Возвращает копию матрицы с обнуленными элементами ниже k-й диагонали

void matrix.Vander(const vector v, const int cols=-1, const bool increasing=false)

vander

Создает матрицу Вандермонда

vector matrix.Row(const unsigned nrow)

 

Возвращает вектор-строку

vector matrix.Col(const unsigned ncol)

 

Возвращает вектор-столбец

unsigned matrix.Rows()

 

Возвращает количество строк в матрице

unsigned matrix.Cols()

 

Возвращает количество столбцов в матрице

void matrix.Init()

 

Инициализирует матрицу

matrix matrix.Transpose()

transpose

Меняет местами оси матрицы, возвращает модифицированную матрицу

matrix matrix.Dot(const matrix b)

dot

Произведение двух матриц

matrix matrix.Inner(const matrix b)

inner

Внутренний продукт двух матриц

matrix matrix.Outer(const matrix b)

outer

Внешний продукт двух матриц

matrix matrix.MatMul(const matrix b)

matmul

Матричное произведение двух матриц

matrix matrix.MatrixPower(const int power)

matrix_power

Возводит квадратную матрицу в (целую) степень n

matrix matrix.Kron(const matrix b)

kron

Возвращает произведение Кронекера двух матриц

bool matrix.Cholesky(matrix& L)

cholesky

Возвращает разложение Холецкого

bool matrix.QR(matrix& Q, matrix& R)

qr

Вычисляет qr-разложение матрицы

bool matrix.SVD(matrix& U, matrix& V, vector& singular_values)

svd

Вычисляет SVD разложение

bool matrix.Eig(matrix& eigen_vectors, vector& eigen_values)

eig

Вычисляет собственные значения и правые собственные векторы квадратной матрицы

bool matrix.EigH(matrix& eigen_vectors, vector& eigen_values)

eigh

Возвращает собственные значения и собственные векторы Эрмитовой матрицы

bool matrix.EigVals(vector& eigen_values)

eigvals

Вычисляет собственные значения общей матрицы

bool matrix.EigValsH(vector& eigen_values)

eigvalsh

Вычисляет собственные значения Эрмитовой матрицы

bool matrix.LU(matrix& L, matrix& U)

 

Выполняет LU-декомпозицию матрицы как произведения нижней треугольной матрицы и верхней треугольной матрицы

bool matrix.LUP(matrix& L, matrix& U, matrix& P)

 

Выполняет LUP-декомпозицию с частичным поворотом, которая является LU-факторизацией с перестановками строк: PA = LU

double matrix.Norm(const norm)

norm

Возвращает норму матрицы или вектора

double matrix.Cond (const norm)

cond

Вычисляет число обусловленности матрицы

vector matrix.Spectrum()

 

Вычисляет спектр матрицы как набор её собственных значений от произведения AT*A

double matrix.Det()

det

Вычисляет детерминант матрицы

int matrix.Rank()

matrix_rank

Возвращает матричный ранг массива с помощью метода Гаусса

int matrix.SLogDet(int& sign)

slogdet

Вычисляет знак и логарифм детерминанта матрицы

double matrix.Trace()

trace

Возвращает сумму по диагоналям матрицы

vector matrix.Solve(const vector b)

solve

Решает линейное матричное уравнение или систему линейных алгебраических уравнений

vector matrix.LstSq(const vector b)

lstsq

Решает систему линейных алгебраических уравнений приблизительно (для неквадратных или вырожденных матриц)

matrix matrix.Inv()

inv

Вычисляет (мультипликативную) обратную матрицу

matrix matrix.PInv()

pinv

Вычисляет псевдообратную матрицу методом Мура-Пенроуза

int matrix.Compare(const matrix matrix_c, const double epsilon)

int matrix.Compare(const matrix matrix_c, const int digits)

int vector.Compare(const vector vector_c, const double epsilon)

int vector.Compare(const vector vector_c, const int digits)

 

Сравнивает элементы двух матриц/векторов с указанной точностью

double matrix.Flat(const ulong index)

bool matrix.Flat(const ulong index,const double value)

flat

Позволяет адресоваться к элементу матрицы через один индекс, а не через два

double vector.ArgMax()

double matrix.ArgMax()

vector matrix.ArgMax(const int axis)

argmax

Возвращает индекс максимального значения

double vector.ArgMin()

double matrix.ArgMin()

vector matrix.ArgMin(const int axis)

argmin

Возвращает индекс минимального значения

double vector.Max()

double matrix.Max()

vector matrix.Max(const int axis)

max

Возвращает максимальное значение в матрице/векторе

double vector.Mean()

double matrix.Mean()

vector matrix.Mean(const int axis)

mean

Вычисляет среднее арифметическое значений элементов

double vector.Min()

double matrix.Min()

vector matrix.Min(const int axis)

min

Возвращает минимальное значение в матрице/векторе

double vector.Sum()

double matrix.Sum()

vector matrix.Sum(const int axis)

sum

Выполняет суммирование элементов матрицы/вектора, которое так же может выполняться по указанной оси (осям).

void vector.Clip(const double min_value,const double max_value)

void matrix.Clip(const double min_value,const double max_value)

clip

Ограничивает элементы матрицы/вектора указанным интервалом допустимых значений

vector vector.CumProd()

vector matrix.CumProd()

matrix matrix.CumProd(const int axis)

cumprod

Возвращает кумулятивное (накапливаемое) произведение элементов массива/вектора, в том числе и по заданной оси

vector vector.CumSum()

vector matrix.CumSum()

matrix matrix.CumSum(const int axis)

cumsum

Возвращает кумулятивную (накапливаемую) сумму элементов матрицы/вектора, в том числе и по заданной оси

double vector.Prod(const double initial=1)

double matrix.Prod(const double initial=1)

vector matrix.Prod(const int axis,const double initial=1)

prod

Вычисляет произведение элементов матрицы/вектора, которое так же может выполняться по указанной оси

void matrix.Reshape(const ulong rows, const ulong cols)

reshape

Изменяет форму матрицы без изменения его данных

void matrix.Resize(const ulong rows,const ulong cols)

resize

Возвращает новую матрицу с указанной формой

bool matrix.SwapRows(const ulong row1, const ulong row2)

 

Обменивает местами строки в матрице

bool matrix.SwapCols(const ulong col1, const ulong col2)

 

Обменивает местами столбцы в матрице

double vector.Ptp()

double matrix.Ptp()

vector matrix.Ptp(const int axis)

ptp

Возвращает диапазон значений матрицы/вектора или указанной оси матрицы и эквивалентна результату Max() - Min()

double vector.Percentile(const int percent)

double matrix.Percentile(const int percent)

vector matrix.Percentile(const int percent,const int axis)

percentile

Вычисляет указанный процентиль (перцентиль) значений элементов матрицы/вектора или элементов вдоль указанной оси. Допустимые значения параметра percent находятся в интервале [0, 100]

double vector.Quantile(const int percent)

double matrix.Quantile(const int percent)

vector matrix.Quantile(const int percent,const int axis)

quantile

Вычисляет указанный квантиль значений элементов матрицы/вектора или элементов вдоль указанной оси. Диапазон значений параметра percent принимает значения в интервале [0, 1]

double vector.Median()

double matrix.Median()

vector matrix.Median(const int axis)

median

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

double vector.Average()

double matrix.Average()

vector matrix.Average(const int axis)

average

Вычисляет среднее арифметическое взвешенное значений элементов матрицы/вектора. Сумма весов в знаменателе не может быть равна 0, но некоторые веса могут быть равны 0

double vector.Std()

double matrix.Std()

vector matrix.Std(const int axis)

std

Вычисляет среднеквадратичное (стандартное) отклонение значений элементов матрицы/вектора или указанной оси

double vector.Var()

double matrix.Var()

vector matrix.Var(const int axis)

var

Вычисляет дисперсию значений элементов матрицы/вектора

double vector.CorrCoef(const vector& v)

matrix matrix.CorrCoef()

corrcoef

Вычисляет коэффициент корреляции Пирсона (линейный коэффициент корреляции). Коэффициент корреляции находится в интервале [-1, 1]

vector vector.Correlate(const vector& v,enum mode)

correlate

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

vector vector.Convolve(const vector& v, enum mode)

convolve

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

matrix matrix.Cov()

matrix vector.Cov(const vector& v); (результатная матрица 2 x 2)

cov

Вычисляет ковариационную матрицу.  Ковариация двух выборок (двух случайных величин) — это мера их линейной зависимости