Matrizes e vetores

Um vector é um tipo de dados especial em MQL5 para trabalhar com vetores, que é uma matriz unidimensional do tipo double. O vetor é um dos conceitos fundamentais da álgebra linear e é usado ativamente em muitos campos da ciência, incluindo física, geometria e outros. Os vetores são usados para resolver sistemas de equações lineares, em gráficos 3D, etc. Com base nos vetores, são definidas operações de adição e multiplicação, e é introduzido o conceito de "Norma" para obter o comprimento ou distância entre vetores. Na programação, os vetores são normalmente representados por matrizes de elementos homogêneos sobre os quais não podem ser realizadas operações vetoriais convencionais, ou seja, as matrizes não podem ser adicionadas umas às outras, multiplicadas umas pelas outras, e não existe o conceito de norma.

Os vetores podem ser representados como um vetor de coluna ou como um vetor de linha quando se trabalha com matrizes. Além disso, em álgebra linear os vetores usam conceitos como covariância e contravariância. Para fins de escrita de código em MQL5, essas diferenças não importam, pois apenas o programador decide qual é cada objeto do tipo vector. Por exemplo, pode ser um vetor de rotação, deslocamento, compressão e assim por diante quando se trata de gráficos 3D.

De um modo geral, do ponto de vista da álgebra linear, um número também é um vetor, só que em um espaço unidimensional. Além disso, um vetor pode ser considerado um caso especial de matriz.

Um matrix é outro tipo de dados especial em MQL5 para representar matrizes, que na verdade é uma matriz bidimensional do tipo double. Vetores e matrizes foram introduzidos na linguagem MQL5 para facilitar o trabalho com certos tipos de conjuntos de dados. Eles permitem que os programadores tirem total proveito da álgebra linear da forma mais simples e próxima da matemática possível. As matrizes são amplamente utilizadas para escrever sistemas compactos de equações algébricas lineares ou diferenciais. Nesse caso, o número de linhas da matriz corresponde ao número de equações e o número de colunas corresponde ao número de incógnitas. Como resultado, a solução de sistemas de equações lineares é reduzida a operações em matrizes.

Existem os seguintes tipos de dados:

  • matrix – matriz contendo elementos do tipo double
  • matrixf – matriz contendo elementos do tipo float
  • matrixc – matriz contendo elementos do tipo complex.
  • vector – vetor contendo elementos do tipo double
  • vectorf – vetor contendo elementos do tipo float
  • vectorc – vetor contendo elementos do tipo complex

Para uso em funções de modelo, é possível usar a entrada matrix<double>, matrix<float>, matrix<complex>, vector<double>, vector<float>, vector<complex> em vez dos tipos correspondentes.

Para uma matriz, são definidas as seguintes operações algébricas:

  • adição de matrizes do mesmo tamanho;
  • multiplicação de matrizes de tamanho adequado, com o número de colunas da matriz à esquerda correspondendo ao número de filas da matriz à direita;
  • multiplicação de matrizes por um vetor de coluna e multiplicação de um vetor de linha por uma matriz de acordo com a regra de multiplicação de matrizes. Ou seja, o vetor é, nesse sentido, um caso especial da matriz;
  • multiplicação de matriz por um número, ou seja, por um escalar.

No campo da matemática, são considerados muitos tipos e tipos diferentes de matrizes. Por exemplo, identidade, simétrica, assimétrica, triangular superior (triangular inferior) e outras matrizes. De particular importância na teoria da matriz são todos os tipos de formas normais, ou seja, a forma canônica à qual uma matriz pode ser reduzida através da substituição de coordenadas. Na prática, são utilizadas formas normais que possuem propriedades adicionais, tais como estabilidade.

O uso de vetores e matrizes, ou melhor, de métodos especiais que estes tipos de dados possuem, permite escrever um código mais simples, mais curto e mais claro que se aproxima da notação matemática. Isto poupa ao programador o trabalho de criar laços aninhados e de lembrar de indexar corretamente as matrizes que estão envolvidas no cálculo. Isto aumenta a confiabilidade e a velocidade de desenvolvimento de programas complexos.

 

Lista de métodos implementados em matrix e vector

Os tipos matrix e vector têm métodos incorporados que correspondem às contrapartidas da biblioteca NumPy. Desta forma, você pode migrar algoritmos e códigos de Python para MQL5 com um esforço mínimo. Assim, muitos problemas de processamento de dados, resolução de equações matemáticas, redes neurais e aprendizagem de máquinas podem ser resolvidos usando bibliotecas de linguagem Python prontas para uso.

Método matrix/vector

Contraparte em NumPy

Descrição

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

eye

Cria uma matriz com uns na diagonal e zeros nos outros lugares

void matrix.Identity(const int rows)

identity

Cria uma matriz quadrada com uns na diagonal principal

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

ones

Cria uma nova matriz por número de filas e colunas, preenchida com unidades

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

zeros

Cria uma nova matriz por número de filas e colunas, preenchida com zeros

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

full

Cria uma nova matriz pelo número de filas e colunas, preenchidas com um valor escalar

void matrix.Copy(const matrix a)

copy

Cria uma cópia de dada matriz

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

frombuffer

Cria uma matriz a partir de uma matriz unidimensional

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

fromfile

Cria uma matriz a partir de dados em um arquivo de texto ou binário

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

fromstring

Cria um vetor baseado em dados de texto a partir de uma string

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

arange

Cria um vetor com valores uniformemente distribuídos em um dado intervalo

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

diag

Extrai uma diagonal ou cria uma matriz diagonal

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

tri

Cria uma matriz com uns na diagonal indicada e abaixo e zeros nos outros lugares

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

tril

Retorna uma cópia da matriz com elementos zerados sobre a diagonal k

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

triu

Retorna uma cópia da matriz com elementos zerados abaixo da diagonal k

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

vander

Cria uma matriz de Vandermonde

vector matrix.Row(const unsigned nrow)

 

Retorna um vetor de linha

vector matrix.Col(const unsigned ncol)

 

Retorna um vetor de coluna

unsigned matrix.Rows()

 

Retorna o número de linhas em uma matriz

unsigned matrix.Cols()

 

Retorna o número de colunas em uma matriz

void matrix.Init()

 

Inicializa uma matriz

matrix matrix.Transpose()

transpose

Troca os eixos de uma matriz, retorna a matriz modificada

matrix matrix.Dot(const matrix b)

dot

Produto de duas matrizes

matrix matrix.Inner(const matrix b)

inner

Produto interno de duas matrizes

matrix matrix.Outer(const matrix b)

outer

Produto externo de duas matrizes

matrix matrix.MatMul(const matrix b)

matmul

Produto de matriz de duas matrizes

matrix matrix.MatrixPower(const int power)

matrix_power

Eleva uma matriz quadrada para a potência (inteira) n

matrix matrix.Kron(const matrix b)

kron

Retorna o produto de Kronecker de duas matrizes

bool matrix.Cholesky(matrix& L)

cholesky

Retorna a decomposição de Cholesky

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

qr

Calcula a fatoração qr de uma matriz

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

svd

Calcula a decomposição SVD

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

eig

Calcula os valores próprios e os vetores próprios direitos de uma matriz quadrada

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

eigh

Retorna os autovalores e autovetores de uma matriz Hermitiana

bool matrix.EigVals(vector& eigen_values)

eigvals

Calcula os valores próprios de uma matriz comum

bool matrix.EigValsH(vector& eigen_values)

eigvalsh

Calcula os valores próprios de uma matriz Hermitiana

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

 

Executa a decomposição LU de uma matriz como o produto de uma matriz triangular inferior e uma matriz triangular superior

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

 

Executa a decomposição LUP de rotação parcial, que é fatoração LU com permutações de linha: PA = LU

double matrix.Norm(const norm)

norm

Retorna a norma de uma matriz ou vetor

double matrix.Norm(const norm)

cond

Calcula o número da condição de uma matriz

vector matrix.Spectrum()

 

Calcula o espectro de uma matriz como um conjunto de seus autovalores a partir do produto AT*A

double matrix.Det()

det

Calcula o determinante de uma matriz

int matrix.Rank()

matrix_rank

Retorna a posto de matriz usando o método Gaussiano

int matrix.SLogDet(int& sign)

slogdet

Calcula o sinal e o logaritmo de um determinante de matriz

double matrix.Trace()

trace

Retorna a soma das diagonais de uma matriz

vector matrix.Solve(const vector b)

solve

Resolve uma equação de matriz linear ou um sistema de equações algébricas lineares

vector matrix.LstSq(const vector b)

lstsq

Resolve um sistema de equações algébricas lineares aproximadamente (para matrizes não quadradas ou degeneradas)

matrix matrix.Inv()

inv

Calcula o inverso (multiplicativo) de uma matriz

matrix matrix.PInv()

pinv

Calcula o pseudoinverso pelo método 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 os elementos de duas matrizes/vetores com a precisão especificada

double matrix.Flat(const ulong index)

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

flat

Permite endereçar um elemento da matriz por meio de um índice, e não por meio de dois

double vector.ArgMax()

double matrix.ArgMax()

vector matrix.ArgMax(const int axis)

argmax

Retorna o índice do valor máximo

double vector.ArgMin()

double matrix.ArgMin()

vector matrix.ArgMin(const int axis)

argmin

Retorna o índice do valor mínimo

double vector.Max()

double matrix.Max()

vector matrix.Max(const int axis)

max

Retorna o valor máximo em uma matriz/vetor

double vector.Mean()

double matrix.Mean()

vector matrix.Mean(const int axis)

mean

Calcula a média aritmética dos valores dos elementos

double vector.Min()

double matrix.Min()

vector matrix.Min(const int axis)

min

Retorna o valor mínimo em uma matriz/vetor

double vector.Sum()

double matrix.Sum()

vector matrix.Sum(const int axis)

sum

Executa uma soma de elementos de matriz/vetor, que também pode ser realizada ao longo do(s) eixo(s) especificado(s).

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

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

clip

Limita os elementos de uma matriz/vetor a um intervalo especificado de valores válidos

vector vector.CumProd()

vector matrix.CumProd()

matrix matrix.CumProd(const int axis)

cumprod

Retorna o produto cumulativo (cumulativo) dos elementos da matriz/vetor, incluindo aqueles ao longo do eixo fornecido

vector vector.CumSum()

vector matrix.CumSum()

matrix matrix.CumSum(const int axis)

cumsum

Retorna a soma cumulativa (cumulativa) de elementos de matriz/vetor, incluindo aqueles ao longo do eixo fornecido

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

Calcula o produto de elementos de matriz/vetor, que também podem ser executados ao longo do eixo especificado

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

reshape

Altera a forma de uma matriz sem mudar seus dados

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

resize

Retorna uma nova matriz com a forma especificada

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

 

Troca de linhas na matriz

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

 

Troca colunas na matriz

double vector.Ptp()

double matrix.Ptp()

vector matrix.Ptp(const int axis)

ptp

Retorna a faixa de valores de matriz/vetor ou o eixo de matriz especificado e equivalente ao resultado Max() - Min()

double vector.Percentile(const int percent)

double matrix.Percentile(const int percent)

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

percentile

Calcula o percentil especificado (percentil) dos valores dos elementos de matriz/vetor ou elementos ao longo do eixo especificado. Os valores válidos do parâmetro de porcentagem estão no intervalo [0, 100]

double vector.Quantile(const int percent)

double matrix.Quantile(const int percent)

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

quantile

Calcula o quantil especificado dos valores dos elementos da matriz/vetor ou dos elementos ao longo do eixo especificado. O intervalo do parâmetro percentual assume valores no intervalo [0, 1]

double vector.Median()

double matrix.Median()

vector matrix.Median(const int axis)

median

Calcula a mediana dos elementos de uma matriz/vetor. A mediana é um valor tal que exatamente metade dos elementos da matriz/vetor será menor que ela, e a outra será maior.

double vector.Average()

double matrix.Average()

vector matrix.Average(const int axis)

average

Calcula a média ponderada aritmética dos valores dos elementos da matriz/vetor. A soma dos pesos no denominador não pode ser 0, mas alguns pesos podem ser 0

double vector.Std()

double matrix.Std()

vector matrix.Std(const int axis)

std

Calcula o desvio quadrático médio (padrão) dos valores dos elementos de uma matriz/vetor ou um eixo especificado

double vector.Var()

double matrix.Var()

vector matrix.Var(const int axis)

var

Calcula a variância dos valores dos elementos de uma matriz/vetor

double vector.CorrCoef(const vector& v)

matrix matrix.CorrCoef()

corrcoef

Calcula o coeficiente de correlação de Pearson (coeficiente de correlação linear). O coeficiente de correlação está no intervalo [-1, 1]

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

correlate

Calcula os valores da função de correlação cruzada (correlação cruzada) de dois vetores. O parâmetro mode determina o modo de cálculo de convolução linear

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

convolve

Retorna uma convolução linear discreta de dois vetores de uma sequência. O parâmetro mode determina o modo de cálculo de convolução linear

matrix matrix.Cov()

matrix vector.Cov(const vector& v); (matriz final 2 x 2)

cov

Calcula a matriz de covariância. A covariância de duas amostras (de duas variáveis aleatórias) é uma medida de sua dependência linear