- Tipos enteros
- Tipos reales (double, float)
- Números complejos (complex)
- Tipo string
- Estructuras, clases e interfaces
- Objeto de un array dinámico
- Matrices y vectores
- Conversión de tipos
- Tipo void y constante NULL
- Tipos personalizados
- Punteros a objetos
- Referencias Modificador & y palabra clave this
Matrices y vectores
El tipo vector es un tipo de datos especial en MQL5 que permite realizar operaciones con vectores. Un vector es un array (matriz) unidimensional de tipo double. Es uno de los conceptos fundamentales del álgebra lineal, utilizado en muchos campos de la ciencia, incluida la física, la geometría y otros. Los vectores se usan para resolver sistemas de ecuaciones lineales, en gráficos 3D y en otras áreas de aplicación. Los vectores se pueden sumar y multiplicar. La longitud o distancia entre vectores se puede obtener mediante la Norma. En programación, los vectores se representan generalmente con la ayuda de arrays de elementos homogéneos que pueden no tener operaciones vectoriales regulares, es decir, cuando los arrays no se pueden sumar o multiplicar, y no tienen una norma.
Los vectores se pueden representar como vectores de fila y vectores de cadena cuando se trabaja con matrices. Además, los vectores en álgebra lineal utilizan los conceptos de covarianza y contravarianza. Estos conceptos no suponen ninguna diferencia a la hora de escribir un código en MQL5, ya que solo el programador decide qué es cada objeto del tipo vectorial. Por ejemplo, puede ser vector de rotación, de desplazamiento o de compresión en gráficos 3D.
En términos generales, desde el punto de vista del álgebra lineal, un número también es un vector, pero en un espacio vectorial unidimensional. Un vector en sí mismo puede considerarse como un caso especial de una matriz.
El tipo matrix es otro tipo de datos especial en MQL5 para representar matrices. Una matriz es en realidad un array bidimensional del tipo double. Los vectores y matrices se han introducido en MQL5 para facilitar las operaciones con ciertos tipos de conjuntos de datos. Con ellos, los desarrolladores pueden beneficiarse de las posibilidades del álgebra lineal de una forma sencilla y similar a las matemáticas. Las matrices se pueden usar para escribir sistemas de ecuaciones diferenciales o lineales de forma compacta. El número de filas de la matriz se corresponde con el número de ecuaciones, mientras que el número de columnas es igual al número de incógnitas. Como resultado, los sistemas de ecuaciones lineales se pueden resolver utilizando operaciones con matrices.
Existen los siguientes tipos de datos:
- matrix matriz que contiene elementos de tipo double
- matrixf matriz que contiene elementos del tipo float
- matrix matriz que contiene elementos del tipo complex
- vector vector que contiene elementos del tipo double
- vectorf vector que contiene elementos del tipo float
- vectorc vector que contiene elementos del tipo complex
Para su uso en funciones de plantilla, podemos utilizar la entrada matrix<double>, matrix<float>, matrix<complex>, vector<double>, vector<float>, vector<complex> en lugar de los tipos correspondientes.
Para las matrices se definen las siguientes operaciones algebraicas:
- Adición de matrices del mismo tamaño
- Multiplicación de matrices de tamaño adecuado: el número de columnas en la matriz izquierda debe ser igual al número de filas en la matriz derecha
- Multiplicación de matrices por un vector de columna; multiplicación de un vector de fila por una matriz según la regla de multiplicación de matrices. En este sentido, el vector supone un caso especial de una matriz.
- Multiplicación de matrices por un número, es decir, por un escalar
Las matemáticas consideran muchos tipos de matrices distintos. Por ejemplo, matrices de identidad, simétricas, asimétricas, triangulares superior e inferior y de otros tipos. Varias formas normales juegan un papel importante en la teoría de matrices. Representan una determinada forma canónica de una matriz, que se puede obtener con la ayuda de determinadas transformaciones. En la práctica, se usan formas normales con propiedades adicionales, como por ejemplo la estabilidad.
El uso de vectores y matrices, o mejor dicho, de métodos especiales de los tipos relevantes, permite crear un código más simple, claro y conciso, cercano a la notación matemática. Con estos métodos, podrá evitar la necesidad de crear ciclos anidados o tener en cuenta la indexación correcta de arrays en los cálculos. Por consiguiente, la utilización de estos métodos aumenta la fiabilidad y la velocidad de desarrollo de programas complejos.
Lista de métodos de matrices y vectoriales
Los tipos matrix y vector incluyen métodos que se corresponden con los métodos relevantes de la biblioteca NumPy. Con estos métodos, podrá traducir algoritmos y códigos de Python a MQL5 con un esfuerzo mínimo. Muchas tareas de procesamiento de datos, ecuaciones matemáticas, redes neuronales y tareas de aprendizaje automático se pueden resolver con la ayuda de bibliotecas y métodos de Python listos para usar.
Método matrix/vector |
Método análogo en NumPy |
Descripción |
---|---|---|
void matrix.Eye(const int rows, const int cols, const int ndiag=0) |
Construye una matriz con unidades en la diagonal y ceros en el resto |
|
void matrix.Identity(const int rows) |
Construye una matriz cuadrada con unidades en la diagonal principal |
|
void matrix.Ones(const int rows, const int cols) |
Construye una nueva matriz de filas y columnas dadas, rellenadas con unidades |
|
void matrix.Zeros(const int rows, const int cols) |
Construye una nueva matriz de filas y columnas dadas, rellenadas con ceros |
|
void matrix.Full(const int rows, const int cols, const scalar value) |
Construye una nueva matriz de filas y columnas dadas, rellenadas con un valor escalar |
|
void matrix.Copy(const matrix a) |
Construye una copia de la matriz dada |
|
void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0) |
Construye una matriz creada a partir de un array unidimensional |
|
void matrix.FromFile(const int rows, condt int cols, const int file_handle, const int count=-1, const int offset=0) |
Construye una matriz a partir de los datos en un archivo de texto o binario |
|
void vector.FromString(const string source, const string sep=" ") |
Construye un vector inicializado a partir de los datos de texto en una cadena |
|
void vector.Arange(const scalar start, const scalar stop, const scalar step=1) |
Construye valores espaciados uniformemente dentro de un intervalo dado |
|
void matrix.Diag(const vector v, const int ndiag=0) |
Extrae una diagonal o construye una matriz diagonal |
|
void matrix.Tri(const int rows, const int cols, const int ndiag=0) |
Construye una matriz con unidades en la diagonal dada y por debajo de esta, y ceros en cualquier otro lugar |
|
void matrix.Tril(const int rows, const int cols, const scalar array[], const int ndiag=0) |
Retorna una copia de una matriz con elementos puestos a cero por encima de la k-ésima diagonal |
|
void matrix.Triu(const int rows, const int cols, const scalar array[], const int ndiag=0) |
Retorna una copia de una matriz con elementos puestos a cero por debajo de la k-ésima diagonal |
|
void matrix.Vander(const vector v, const int cols=-1, const bool increasing=false) |
Genera una matriz de Vandermonde |
|
vector matrix.Row(const unsigned nrow) |
|
Retorna un vector de fila |
vector matrix.Col(const unsigned ncol) |
|
Retorna un vector de columna |
unsigned matrix.Rows() |
|
Retorna el número de filas en una matriz |
unsigned matrix.Cols() |
|
Retorna el número de columnas en una matriz |
void matrix.Init() |
|
Inicializa una matriz |
matrix matrix.Transpose() |
Invierte o permuta los ejes de una matriz; retorna la matriz modificada |
|
matrix matrix.Dot(const matrix b) |
Producto escalar de dos matrices |
|
matrix matrix.Inner(const matrix b) |
Producto interno de dos matrices |
|
matrix matrix.Outer(const matrix b) |
Calcula el producto externo de dos matrices |
|
matrix matrix.MatMul(const matrix b) |
Producto matricial de dos matrices |
|
matrix matrix.MatrixPower(const int power) |
Eleva una matriz cuadrada a la potencia (entera) n |
|
matrix matrix.Kron(const matrix b) |
Retorna el producto de Kronecker de dos matrices |
|
bool matrix.Cholesky(matrix& L) |
Retorna la descomposición de Cholesky |
|
bool matrix.QR(matrix& Q, matrix& R) |
Calcula la factorización qr de una matriz |
|
bool matrix.SVD(matrix& U, matrix& V, vector& singular_values) |
Valor singular de descomposición |
|
bool matrix.Eig(matrix& eigen_vectors, vector& eigen_values) |
Calcula los valores propios y los vectores propios derechos de una matriz cuadrada |
|
bool matrix.EigH(matrix& eigen_vectors, vector& eigen_values) |
Retorna los valores propios y vectores propios de una matriz hermitiana |
|
bool matrix.EigVals(vector& eigen_values) |
Calcula los valores propios de una matriz general |
|
bool matrix.EigValsH(vector& eigen_values) |
Calcula los valores propios de una matriz hermitiana |
|
bool matrix.LU(matrix& L, matrix& U) |
|
Descomposición LU de una matriz como el producto de una matriz triangular inferior y una matriz triangular superior |
bool matrix.LUP(matrix& L, matrix& U, matrix& P) |
|
Descomposición LUP con pivoteo parcial, referido a la descomposición LU con permutaciones de fila únicamente:PA=LU |
double matrix.Norm(const norm) |
Retorna la norma de una matriz o vector |
|
double matrix.Cond(const norm) |
Calcula el número de condición de una matriz |
|
vector matrix.Spectrum() |
|
Calcula el espectro de una matriz como el conjunto de sus valores propios del producto AT*A |
double matrix.Det() |
Calcula el determinante de un array |
|
int matrix.Rank() |
Retorna el rango de matriz de un array usando el método gaussiano |
|
int matrix.SLogDet(int& sign) |
Calcula el signo y el logaritmo del determinante de un array |
|
double matrix.Trace() |
Retorna la suma a lo largo de las diagonales de la matriz |
|
vector matrix.Solve(const vector b) |
Resuelve una ecuación de matriz lineal o un sistema de ecuaciones algebraicas lineales |
|
vector matrix.LstSq(const vector b) |
Retorna la solución de los mínimos cuadrados de ecuaciones algebraicas lineales (para matrices no cuadradas o degeneradas) |
|
matrix matrix.Inv() |
Calcula la inversa (multiplicativa) de una matriz |
|
matrix matrix.PInv() |
Calcula la pseudo-inversa de una matriz con el método de Moore-Penrose |
|
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) |
|
Compara los elementos de dos matrices/vectores con la precisión indicada |
double matrix.Flat(const ulong index) bool matrix.Flat(const ulong index,const double value) |
Permite dirigir un elemento de la matriz a través de un índice, en lugar de dos |
|
double vector.ArgMax() double matrix.ArgMax() vector matrix.ArgMax(const int axis) |
Retorna el índice del valor máximo |
|
double vector.ArgMin() double matrix.ArgMin() vector matrix.ArgMin(const int axis) |
Retorna el índice del valor mínimo |
|
double vector.Max() double matrix.Max() vector matrix.Max(const int axis) |
Retorna el valor máximo en una matriz/vector |
|
double vector.Mean() double matrix.Mean() vector matrix.Mean(const int axis) |
Calcula la media aritmética de los valores de los elementos |
|
double vector.Min() double matrix.Min() vector matrix.Min(const int axis) |
Retorna el valor mínimo en una matriz/vector |
|
double vector.Sum() double matrix.Sum() vector matrix.Sum(const int axis) |
Ejecuta la suma de los elementos de una matriz/vector, que también se puede realizar según el eje(s) indicado(s). |
|
void vector.Clip(const double min_value,const double max_value) void matrix.Clip(const double min_value,const double max_value) |
Limita los elementos de una matriz/vector con el intervalo indicado de valores permitidos |
|
vector vector.CumProd() vector matrix.CumProd() matrix matrix.CumProd(const int axis) |
Retorna el producto acumulado de los elementos de un array/vector, incluido en el eje indicado |
|
vector vector.CumSum() vector matrix.CumSum() matrix matrix.CumSum(const int axis) |
Retorna la suma acumulada de los elementos de una matriz/vector, incluido en el eje indicado |
|
double vector.Prod(const double initial=1) double matrix.Prod(const double initial=1) vector matrix.Prod(const int axis,const double initial=1) |
Calcula el producto de los elementos de una matriz/vector, que también se puede ejecutar según el eje indicado |
|
void matrix.Reshape(const ulong rows, const ulong cols) |
Cambia la forma de una matriz sin modificar sus datos |
|
void matrix.Resize(const ulong rows,const ulong cols) |
Retorna una nueva matriz con la forma indicada |
|
bool matrix.SwapRows(const ulong row1, const ulong row2) |
|
Muda de sitio las líneas en una matriz |
bool matrix.SwapCols(const ulong col1, const ulong col2) |
|
Muda de sitio las columnas en una matriz |
double vector.Ptp() double matrix.Ptp() vector matrix.Ptp(const int axis) |
Retorna el intervalo de valores de una matriz/vector o del eje indicado de una matriz y del equivalente al resultado Max() - Min() |
|
double vector.Percentile(const int percent) double matrix.Percentile(const int percent) vector matrix.Percentile(const int percent,const int axis) |
Calcula el percentil indicado de los valores de los elementos de una matriz/vector o de los elementos a lo largo del eje indicado. Los valores permitidos del parámetro percent se encuentran en el intervalo [0, 100] |
|
double vector.Quantile(const int percent) double matrix.Quantile(const int percent) vector matrix.Quantile(const int percent,const int axis) |
Calcula el cuantil indicado de los valores de los elementos de una matriz/vector o de los elementos a lo largo del eje indicado. El intervalo de valores del parámetro percent adopta los valores en el intervalo [0, 1] |
|
double vector.Median() double matrix.Median() vector matrix.Median(const int axis) |
Calcula la mediana de los elementos de una matriz/vector. La mediana es un valor tal que exactemente la mitad de los elementos de una matriz/vector resultará menor a él, mientras que la otra será mayor. |
|
double vector.Average() double matrix.Average() vector matrix.Average(const int axis) |
Calcula la media aritmética ponderada de los elementos de una matriz/vector. La suma de los pesos en el denominador no puede ser igual a 0, pero ciertos pesos pueden ser iguales a 0 |
|
double vector.Std() double matrix.Std() vector matrix.Std(const int axis) |
Calcula la desviación media cuadrática (estándar) de los valores de los elementos de una matriz/vector o del eje indicado |
|
double vector.Var() double matrix.Var() vector matrix.Var(const int axis) |
Calcula la varianza de los valores de los elementos de una matriz/vector |
|
double vector.CorrCoef(const vector& v) matrix matrix.CorrCoef() |
Calcula el coeficiente de correlación de Pearson (coeficiente de correlación lineal). El coeficiente de correlación se encuentra en el intervalo [-1, 1] |
|
vector vector.Correlate(const vector& v,enum mode) |
Calcula los valores de la función de correlación mutua (correlación cruzada) de dos vectores. El parámetro "mode" determina el modo de cálculo de la convolución lineal |
|
vector vector.Convolve(const vector& v, enum mode) |
Retorna la convolución lineal discreta de dos vectores El parámetro "mode" determina el modo de cálculo de la convolución lineal |
|
matrix matrix.Cov() matrix vector.Cov(const vector& v); (matriz resultante 2 x 2) |
Calcula la matriz de covarianza. La covarianza de dos muestras (dos magnitudes aleatorias) es la medida de su dependencia lineal |