- Типы матриц и векторов
- Создание и инициализация матриц и векторов
- Копирование матриц, векторов и массивов
- Копирование таймсерий в матрицу или вектор
- Копирование истории тиков в матрицу или вектор
- Вычисление выражений с матрицами и векторами
- Манипуляции над матрицами и векторами
- Произведения матриц и векторов
- Преобразования (разложение) матриц
- Получение статистики
- Характеристики матриц и векторов
- Решение уравнений
- Методы машинного обучения
Произведения матриц и векторов
Умножение матриц является одной из базовых операций в различных численных методах. Например, она часто применяется при реализации прямого и обратного распространения сигнала в слоях нейронных сетей.
К разряду матричных произведений можно отнести также различного рода свертки. Группа таких функций в MQL5 выглядит следующим образом:
- MatMul — матричное произведение двух матриц;
- Power — возведение квадратной матрицы в указанную целочисленную степень;
- Inner — внутреннее произведение двух матриц;
- Outer — внешнее произведение двух матриц или двух векторов;
- Kron — произведение Кронекера двух матриц, матрицы и вектора, вектора и матрицы или двух векторов;
- CorrCoef — вычисление корреляции Пирсона между строками или столбцами матрицы, или между векторами;
- Cov — вычисление ковариационной матрицы строк или столбцов матрицы, или между двумя векторами;
- Correlate — вычисление взаимной корреляции (кросс-корреляции) двух векторов;
- Convolve — вычисление дискретной линейной свертки двух векторов;
- Dot — скалярное произведение двух векторов.
Чтобы дать общее представление, как управлять этими методами, приведем их прототипы (в порядке от матричных, через смешанные матрично-векторные, к векторным).
matrix<T> matrix<T>::MatMul(const matrix<T> &m)
matrix<T> matrix<T>::Power(const int power)
matrix<T> matrix<T>::Inner(const matrix<T> &m)
matrix<T> matrix<T>::Outer(const matrix<T> &m)
matrix<T> matrix<T>::Kron(const matrix<T> &m)
matrix<T> matrix<T>::Kron(const vector<T> &v)
matrix<T> matrix<T>::CorrCoef(const bool rows = true)
matrix<T> matrix<T>::Cov(const bool rows = true)
matrix<T> vector<T>::Cov(const vector<T> &v)
T vector<T>::CorrCoef(const vector<T> &v)
vector<T> vector<T>::Correlate(const vector<T> &v, ENUM_VECTOR_CONVOLVE mode)
vector<T> vector<T>::Convolve(const vector<T> &v, ENUM_VECTOR_CONVOLVE mode)
matrix<T> vector<T>::Outer(const vector<T> &v)
matrix<T> vector<T>::Kron(const matrix<T> &m)
matrix<T> vector<T>::Kron(const vector<T> &v)
T vector<T>::Dot(const vector<T> &v)
Вот простой пример матричного произведения двух матриц с помощью метода MatMul:
matrix a = {{1, 0, 0},
|
Умножать между собой можно матрицы вида A[M,N] * B[N,K] = С[M,K], то есть количество столбцов в матрице слева должно быть равно количеству строк в матрице справа. Если размеры не согласованы, результатом будет пустая матрица.
При умножении матрицы и вектора допустимы два варианта:
- горизонтальный вектор (строка) умножается на матрицу справа, длина вектора равна количеству строк матрицы;
- матрица умножается на вертикальный вектор (столбец) справа, длина вектора равна количеству столбцов матрицы.
Векторы также можно перемножать между собой. В MatMul это всегда эквивалентно скалярному произведению (метод Dot) вектора-строки на вектор-столбец, а вариант, когда вектор-столбец умножается на вектор-строку и получается матрица, поддерживается другим методом — Outer.
Продемонстрируем Outer-произведение вектора v5 на вектор v3 и в обратной последовательности. В обоих случаях слева подразумевается вектор-столбец, а справа — вектор-строка.
vector v3 = {1, 2, 3};
|