- Целые типы
- Вещественные типы (double, float)
- Комплексное число (complex)
- Тип string
- Структуры, классы и интерфейсы
- Объект динамического массива
- Матрицы и векторы
- Приведение типов
- Тип void и константа NULL
- Пользовательские типы
- Указатели объектов
- Ссылки. Модификатор & и ключевое слово this
Матрицы и векторы
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) |
Создает матрицу с единицами по диагонали и нулями в остальных местах |
|
void matrix.Identity(const int rows) |
Создает квадратную матрицу с единицами на главной диагонали |
|
void matrix.Ones(const int rows, const int cols) |
Создает новую матрицу по числу строк и столбцов, заполненную единицами |
|
void matrix.Zeros(const int rows, const int cols) |
Создает новую матрицу по числу строк и столбцов, заполненную нулями. |
|
void matrix.Full(const int rows, const int cols, const scalar value) |
Создает новую матрицу по числу строк и столбцов, заполненную скалярным значением |
|
void matrix.Copy(const matrix a) void vector.Copy(const vector v) |
Создает копию данной матрицы |
|
void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0) |
Создает матрицу из одномерного массива |
|
void matrix.FromFile(const int rows, condt int cols, const int file_handle, const int count=-1, const int offset=0) |
Создает матрицу из данных в текстовом или двоичном файле |
|
void vector.FromString(const string source, const string sep=" ") |
Создает вектор на основе текстовых данных из строки |
|
void vector.Arange(const scalar start, const scalar stop, const scalar step=1) |
Создает вектор с равномерно распределенными значениями в заданном интервале |
|
void matrix.Diag(const vector v, const int ndiag=0) |
Извлекает диагональ или создает диагональную матрицу |
|
void matrix.Tri(const int rows, const int cols, const int ndiag=0) |
Создает матрицу с единицами на указанной диагонали и ниже и с нулями в остальных местах |
|
void matrix.Tril(const int rows, const int cols, const scalar array[], const int ndiag=0) |
Возвращает копию матрицы с обнуленными элементами над k-й диагональю |
|
void matrix.Triu(const int rows, const int cols, const scalar array[], const int ndiag=0) |
Возвращает копию матрицы с обнуленными элементами ниже k-й диагонали |
|
void matrix.Vander(const vector v, const int cols=-1, const bool increasing=false) |
Создает матрицу Вандермонда |
|
vector matrix.Row(const unsigned nrow) |
|
Возвращает вектор-строку |
vector matrix.Col(const unsigned ncol) |
|
Возвращает вектор-столбец |
unsigned matrix.Rows() |
|
Возвращает количество строк в матрице |
unsigned matrix.Cols() |
|
Возвращает количество столбцов в матрице |
void matrix.Init() |
|
Инициализирует матрицу |
matrix matrix.Transpose() |
Меняет местами оси матрицы, возвращает модифицированную матрицу |
|
matrix matrix.Dot(const matrix b) |
Произведение двух матриц |
|
matrix matrix.Inner(const matrix b) |
Внутренний продукт двух матриц |
|
matrix matrix.Outer(const matrix b) |
Внешний продукт двух матриц |
|
matrix matrix.MatMul(const matrix b) |
Матричное произведение двух матриц |
|
matrix matrix.MatrixPower(const int power) |
Возводит квадратную матрицу в (целую) степень n |
|
matrix matrix.Kron(const matrix b) |
Возвращает произведение Кронекера двух матриц |
|
bool matrix.Cholesky(matrix& L) |
Возвращает разложение Холецкого |
|
bool matrix.QR(matrix& Q, matrix& R) |
Вычисляет qr-разложение матрицы |
|
bool matrix.SVD(matrix& U, matrix& V, vector& singular_values) |
Вычисляет SVD разложение |
|
bool matrix.Eig(matrix& eigen_vectors, vector& eigen_values) |
Вычисляет собственные значения и правые собственные векторы квадратной матрицы |
|
bool matrix.EigH(matrix& eigen_vectors, vector& eigen_values) |
Возвращает собственные значения и собственные векторы Эрмитовой матрицы |
|
bool matrix.EigVals(vector& eigen_values) |
Вычисляет собственные значения общей матрицы |
|
bool matrix.EigValsH(vector& eigen_values) |
Вычисляет собственные значения Эрмитовой матрицы |
|
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) |
Возвращает норму матрицы или вектора |
|
double matrix.Cond (const norm) |
Вычисляет число обусловленности матрицы |
|
vector matrix.Spectrum() |
|
Вычисляет спектр матрицы как набор её собственных значений от произведения AT*A |
double matrix.Det() |
Вычисляет детерминант матрицы |
|
int matrix.Rank() |
Возвращает матричный ранг массива с помощью метода Гаусса |
|
int matrix.SLogDet(int& sign) |
Вычисляет знак и логарифм детерминанта матрицы |
|
double matrix.Trace() |
Возвращает сумму по диагоналям матрицы |
|
vector matrix.Solve(const vector b) |
Решает линейное матричное уравнение или систему линейных алгебраических уравнений |
|
vector matrix.LstSq(const vector b) |
Решает систему линейных алгебраических уравнений приблизительно (для неквадратных или вырожденных матриц) |
|
matrix matrix.Inv() |
Вычисляет (мультипликативную) обратную матрицу |
|
matrix matrix.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) |
Позволяет адресоваться к элементу матрицы через один индекс, а не через два |
|
double vector.ArgMax() double matrix.ArgMax() vector matrix.ArgMax(const int axis) |
Возвращает индекс максимального значения |
|
double vector.ArgMin() double matrix.ArgMin() vector matrix.ArgMin(const int axis) |
Возвращает индекс минимального значения |
|
double vector.Max() double matrix.Max() vector matrix.Max(const int axis) |
Возвращает максимальное значение в матрице/векторе |
|
double vector.Mean() double matrix.Mean() vector matrix.Mean(const int axis) |
Вычисляет среднее арифметическое значений элементов |
|
double vector.Min() double matrix.Min() vector matrix.Min(const int axis) |
Возвращает минимальное значение в матрице/векторе |
|
double vector.Sum() double matrix.Sum() vector matrix.Sum(const int axis) |
Выполняет суммирование элементов матрицы/вектора, которое так же может выполняться по указанной оси (осям). |
|
void vector.Clip(const double min_value,const double max_value) void matrix.Clip(const double min_value,const double max_value) |
Ограничивает элементы матрицы/вектора указанным интервалом допустимых значений |
|
vector vector.CumProd() vector matrix.CumProd() matrix matrix.CumProd(const int axis) |
Возвращает кумулятивное (накапливаемое) произведение элементов массива/вектора, в том числе и по заданной оси |
|
vector vector.CumSum() vector matrix.CumSum() matrix matrix.CumSum(const int axis) |
Возвращает кумулятивную (накапливаемую) сумму элементов матрицы/вектора, в том числе и по заданной оси |
|
double vector.Prod(const double initial=1) double matrix.Prod(const double initial=1) vector matrix.Prod(const int axis,const double initial=1) |
Вычисляет произведение элементов матрицы/вектора, которое так же может выполняться по указанной оси |
|
void matrix.Reshape(const ulong rows, const ulong cols) |
Изменяет форму матрицы без изменения его данных |
|
void matrix.Resize(const ulong rows,const ulong cols) |
Возвращает новую матрицу с указанной формой |
|
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) |
Возвращает диапазон значений матрицы/вектора или указанной оси матрицы и эквивалентна результату Max() - Min() |
|
double vector.Percentile(const int percent) double matrix.Percentile(const int percent) vector matrix.Percentile(const int percent,const int axis) |
Вычисляет указанный процентиль (перцентиль) значений элементов матрицы/вектора или элементов вдоль указанной оси. Допустимые значения параметра percent находятся в интервале [0, 100] |
|
double vector.Quantile(const int percent) double matrix.Quantile(const int percent) vector matrix.Quantile(const int percent,const int axis) |
Вычисляет указанный квантиль значений элементов матрицы/вектора или элементов вдоль указанной оси. Диапазон значений параметра percent принимает значения в интервале [0, 1] |
|
double vector.Median() double matrix.Median() vector matrix.Median(const int axis) |
Вычисляет медиану элементов матрицы/векторы. Медиана — это такое значение, что ровно половина элементов матрицы/вектора окажется меньше него, а другая больше. |
|
double vector.Average() double matrix.Average() vector matrix.Average(const int axis) |
Вычисляет среднее арифметическое взвешенное значений элементов матрицы/вектора. Сумма весов в знаменателе не может быть равна 0, но некоторые веса могут быть равны 0 |
|
double vector.Std() double matrix.Std() vector matrix.Std(const int axis) |
Вычисляет среднеквадратичное (стандартное) отклонение значений элементов матрицы/вектора или указанной оси |
|
double vector.Var() double matrix.Var() vector matrix.Var(const int axis) |
Вычисляет дисперсию значений элементов матрицы/вектора |
|
double vector.CorrCoef(const vector& v) matrix matrix.CorrCoef() |
Вычисляет коэффициент корреляции Пирсона (линейный коэффициент корреляции). Коэффициент корреляции находится в интервале [-1, 1] |
|
vector vector.Correlate(const vector& v,enum mode) |
Вычисляет значения взаимнокорреляционной функции (кросс-корреляцию) двух векторов. Параметр mode определяет режим вычисления линейной свертки |
|
vector vector.Convolve(const vector& v, enum mode) |
Возвращает дискретную линейную свертку двух векторов последовательностей. Параметр mode определяет режим вычисления линейной свертки |
|
matrix matrix.Cov() matrix vector.Cov(const vector& v); (результатная матрица 2 x 2) |
Вычисляет ковариационную матрицу. Ковариация двух выборок (двух случайных величин) — это мера их линейной зависимости |