- Tipi Integer
- Tipi Reali (double, float)
- Numero complesso (complex, complexf)
- Tipo Stringa
- Strutture, Classi e Interfacce
- Oggetto Array Dinamico
- Matrices and vectors
- Typecasting
- Tipo Void e Costante NULL
- Tipi definiti dall'utente
- Puntatori agli Oggetti
- Riferimento. Il Modifier & e la parola chiave this
Matrici e vettori
Il tipo vector è un tipo di dati speciale in MQL5 che consente di eseguire operazioni con i vettori. Un vettore è un array monodimensionale di tipo double. È uno dei concetti fondamentali dell'algebra lineare, utilizzato in molti campi della scienza, tra cui fisica, geometria e altri. I vettori vengono usati per risolvere sistemi di equazioni lineari, nella grafica 3D e in altri ambiti applicativi. I vettori possono essere sommati e moltiplicati. La lunghezza o la distanza tra vettori può essere ottenuta tramite la norma. Nella programmazione, i vettori sono solitamente rappresentati da array di elementi omogenei, che possono non avere le normali operazioni vettoriali, cioè quando gli array non possono essere sommati o moltiplicati e non hanno una norma.
Quando si lavora con le matrici, i vettori possono essere rappresentati come vettori riga e vettori colonna. Inoltre, nell'algebra lineare i vettori usano i concetti di covarianza e controvarianza. Questi concetti non fanno alcuna differenza nella scrittura del codice MQL5, poiché solo il programmatore decide cosa rappresenta ogni oggetto di tipo vector. Ad esempio, nella grafica 3D può trattarsi di un vettore di rotazione, spostamento o compressione.
In generale, dal punto di vista dell'algebra lineare, anche un numero è un vettore, ma in uno spazio vettoriale monodimensionale. Un vettore stesso può essere considerato un caso particolare di matrice.
Il tipo matrix è un altro tipo di dati speciale in MQL5 per rappresentare le matrici. Una matrice è in realtà un array bidimensionale di tipo double. I vettori e le matrici sono stati introdotti in MQL5 per semplificare le operazioni con determinati tipi di insiemi di dati. Grazie a essi, gli sviluppatori possono sfruttare le possibilità dell'algebra lineare in una forma semplice e vicina alla notazione matematica. Le matrici possono essere usate per scrivere in modo compatto sistemi di equazioni lineari o differenziali. Il numero di righe della matrice corrisponde al numero di equazioni, mentre il numero di colonne è uguale al numero di incognite. Di conseguenza, i sistemi di equazioni lineari possono essere risolti tramite operazioni matriciali.
Sono disponibili i seguenti tipi di dati:
- matrix — matrice contenente elementi di tipo double
- matrixf — matrice contenente elementi di tipo float
- matrixc — matrice contenente elementi di tipo complex
- vector — vettore contenente elementi di tipo double
- vectorf — vettore contenente elementi di tipo float
- vectorc — vettore contenente elementi di tipo complex
- vectorcf — vettore contenente elementi di tipo complexf
Per l'uso nelle funzioni template, è possibile utilizzare le notazioni matrix<double>, matrix<float>, matrix<complex>, matrix<complexf>, vector<double>, vector<float>, vector<complex>, vector<complexf> al posto dei tipi corrispondenti.
Per le matrici sono definite le seguenti operazioni algebriche:
- Addizione di matrici della stessa dimensione
- Moltiplicazione di matrici di dimensioni compatibili: il numero di colonne della matrice a sinistra deve essere uguale al numero di righe della matrice a destra
- Moltiplicazione di una matrice per un vettore colonna; moltiplicazione di un vettore riga per una matrice secondo la regola di moltiplicazione delle matrici. In questo senso il vettore è un caso particolare di matrice
- Moltiplicazione di una matrice per un numero, cioè per uno scalare
In matematica vengono considerati molti tipi diversi di matrici. Ad esempio, matrice identità, matrici simmetriche, antisimmetriche, triangolari superiori e inferiori e altri tipi. Le varie forme normali svolgono un ruolo importante nella teoria delle matrici. Rappresentano una determinata forma canonica di una matrice, che può essere ottenuta mediante specifiche trasformazioni. In pratica si usano forme normali che hanno proprietà aggiuntive, ad esempio la stabilità.
L'uso di vettori e matrici, o meglio dei metodi speciali dei rispettivi tipi, consente di creare codice più semplice, breve e chiaro, vicino alla notazione matematica. Con questi metodi si può evitare di creare cicli annidati o di controllare la corretta indicizzazione degli array nei calcoli. Pertanto, l'uso di questi metodi aumenta l'affidabilità e la velocità nello sviluppo di programmi complessi.
Elenco dei metodi di matrici e vettori
I tipi matrix e vector includono metodi che corrispondono ai rispettivi metodi della libreria NumPy. Utilizzando questi metodi, è possibile tradurre algoritmi e codice da Python a MQL5 con il minimo sforzo. Molte attività di elaborazione dei dati, equazioni matematiche, reti neurali e attività di apprendimento automatico possono essere risolte usando metodi e librerie Python già pronti.
Metodo matrix/vector |
Metodo analogo in NumPy |
Descrizione |
|---|---|---|
void matrix.Eye(const int rows, const int cols, const int ndiag=0) |
Costruisce una matrice con uno sulla diagonale e zeri altrove |
|
void matrix.Identity(const int rows) |
Costruisce una matrice quadrata con uno sulla diagonale principale |
|
void matrix.Ones(const int rows, const int cols) |
Costruisce una nuova matrice con il numero specificato di righe e colonne, riempita con uno |
|
void matrix.Zeros(const int rows, const int cols) |
Costruisce una nuova matrice con il numero specificato di righe e colonne, riempita con zeri |
|
void matrix.Full(const int rows, const int cols, const scalar value) |
Costruisce una nuova matrice con il numero specificato di righe e colonne, riempita con un valore scalare |
|
void matrix.Copy(const matrix a) |
Costruisce una copia della matrice specificata |
|
void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0) |
Costruisce una matrice a partire da un array monodimensionale |
|
void matrix.FromFile(const int rows, condt int cols, const int file_handle, const int count=-1, const int offset=0) |
Costruisce una matrice dai dati in un file di testo o binario |
|
void vector.FromString(const string source, const string sep=" ") |
Costruisce un vettore inizializzato con dati di testo contenuti in una stringa |
|
void vector.Arange(const scalar start, const scalar stop, const scalar step=1) |
Costruisce valori equidistanti entro un intervallo specificato |
|
void matrix.Diag(const vector v, const int ndiag=0) |
Estrae una diagonale o costruisce una matrice diagonale |
|
void matrix.Tri(const int rows, const int cols, const int ndiag=0) |
Costruisce una matrice con uno sulla diagonale specificata e sotto di essa e zeri altrove |
|
void matrix.Tril(const int rows, const int cols, const scalar array[], const int ndiag=0) |
Restituisce una copia della matrice con gli elementi sopra la k-esima diagonale azzerati |
|
void matrix.Triu(const int rows, const int cols, const scalar array[], const int ndiag=0) |
Restituisce una copia della matrice con gli elementi sotto la k-esima diagonale azzerati |
|
void matrix.Vander(const vector v, const int cols=-1, const bool increasing=false) |
Genera una matrice di Vandermonde |
|
vector matrix.Row(const unsigned nrow) |
|
Restituisce un vettore riga |
vector matrix.Col(const unsigned ncol) |
|
Restituisce un vettore colonna |
unsigned matrix.Rows() |
|
Restituisce il numero di righe in una matrice |
unsigned matrix.Cols() |
|
Restituisce il numero di colonne in una matrice |
void matrix.Init() |
|
Inizializza una matrice |
matrix matrix.Transpose() |
Inverte o permuta gli assi di una matrice; restituisce la matrice modificata |
|
matrix matrix.Dot(const matrix b) |
Prodotto scalare di due matrici |
|
matrix matrix.Inner(const matrix b) |
Prodotto interno di due matrici |
|
matrix matrix.Outer(const matrix b) |
Calcola il prodotto esterno di due matrici |
|
matrix matrix.MatMul(const matrix b) |
Prodotto matriciale di due matrici |
|
matrix matrix.MatrixPower(const int power) |
Eleva una matrice quadrata alla potenza intera n |
|
matrix matrix.Kron(const matrix b) |
Restituisce il prodotto di Kronecker di due matrici |
|
bool matrix.Cholesky(matrix& L) |
Restituisce la decomposizione di Cholesky |
|
bool matrix.QR(matrix& Q, matrix& R) |
Calcola la fattorizzazione QR di una matrice |
|
bool matrix.SVD(matrix& U, matrix& V, vector& singular_values) |
Decomposizione ai valori singolari |
|
bool matrix.Eig(matrix& eigen_vectors, vector& eigen_values) |
Calcola gli autovalori e gli autovettori destri di una matrice quadrata |
|
bool matrix.EigH(matrix& eigen_vectors, vector& eigen_values) |
Restituisce gli autovalori e gli autovettori di una matrice hermitiana |
|
bool matrix.EigVals(vector& eigen_values) |
Calcola gli autovalori di una matrice generale |
|
bool matrix.EigValsH(vector& eigen_values) |
Calcola gli autovalori di una matrice hermitiana |
|
bool matrix.LU(matrix& L, matrix& U) |
|
Decomposizione LU di una matrice come prodotto di una matrice triangolare inferiore e una matrice triangolare superiore |
bool matrix.LUP(matrix& L, matrix& U, matrix& P) |
|
Decomposizione LUP con pivoting parziale, cioè decomposizione LU con sole permutazioni di righe: PA=LU |
double matrix.Norm(const norm) |
Restituisce la norma di una matrice o di un vettore |
|
double matrix.Cond(const norm) |
Calcola il numero di condizionamento di una matrice |
|
vector matrix.Spectrum() |
|
Calcola lo spettro di una matrice come insieme dei suoi autovalori dal prodotto AT*A |
double matrix.Det() |
Calcola il determinante di un array |
|
int matrix.Rank() |
Restituisce il rango della matrice di un array usando il metodo gaussiano |
|
int matrix.SLogDet(int& sign) |
Calcola il segno e il logaritmo del determinante di un array |
|
double matrix.Trace() |
Restituisce la somma lungo le diagonali della matrice |
|
vector matrix.Solve(const vector b) |
Risolve un'equazione matriciale lineare o un sistema di equazioni algebriche lineari |
|
vector matrix.LstSq(const vector b) |
Restituisce la soluzione ai minimi quadrati di equazioni algebriche lineari (per matrici non quadrate o degeneri) |
|
matrix matrix.Inv() |
Calcola l'inversa (moltiplicativa) di una matrice |
|
matrix matrix.PInv() |
Calcola la pseudoinversa di una matrice con il metodo di 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) |
|
Confronta gli elementi di due matrici/vettori con la precisione specificata |
double matrix.Flat(const ulong index) bool matrix.Flat(const ulong index,const double value) |
Consente di indirizzare un elemento di matrice tramite un indice anziché due |
|
double vector.ArgMax() double matrix.ArgMax() vector matrix.ArgMax(const int axis) |
Restituisce l'indice del valore massimo |
|
double vector.ArgMin() double matrix.ArgMin() vector matrix.ArgMin(const int axis) |
Restituisce l'indice del valore minimo |
|
double vector.Max() double matrix.Max() vector matrix.Max(const int axis) |
Restituisce il valore massimo in una matrice/vettore |
|
double vector.Mean() double matrix.Mean() vector matrix.Mean(const int axis) |
Calcola la media aritmetica dei valori degli elementi |
|
double vector.Min() double matrix.Min() vector matrix.Min(const int axis) |
Restituisce il valore minimo in una matrice/vettore |
|
double vector.Sum() double matrix.Sum() vector matrix.Sum(const int axis) |
Restituisce la somma degli elementi matrice/vettore che può essere eseguita anche per l'asse dato (assi). |
|
void vector.Clip(const double min_value,const double max_value) void matrix.Clip(const double min_value,const double max_value) |
Limita gli elementi di una matrice/vettore a un intervallo specificato di valori validi |
|
vector vector.CumProd() vector matrix.CumProd() matrix matrix.CumProd(const int axis) |
Restituisce il prodotto cumulativo di elementi matrice/vettoriali, inclusi quelli lungo l'asse specificato |
|
vector vector.CumSum() vector matrix.CumSum() matrix matrix.CumSum(const int axis) |
Restituisce la somma cumulativa di elementi matrice/vettore, inclusi quelli lungo l'asse specificato |
|
double vector.Prod(const double initial=1) double matrix.Prod(const double initial=1) vector matrix.Prod(const int axis,const double initial=1) |
Restituisce il prodotto degli elementi matrice/vettore che può essere eseguito anche per l'asse dato |
|
void matrix.Reshape(const ulong rows, const ulong cols) |
Modifica la forma di una matrice senza modificarne i dati |
|
void matrix.Resize(const ulong rows,const ulong cols) |
Restituisce una nuova matrice con una forma e una dimensione modificate |
|
bool matrix.SwapRows(const ulong row1, const ulong row2) |
|
Scambia le righe in una matrice |
bool matrix.SwapCols(const ulong col1, const ulong col2) |
|
Scambia le colonne in una matrice |
double vector.Ptp() double matrix.Ptp() vector matrix.Ptp(const int axis) |
Restituisce l'intervallo di valori di una matrice/vettore o dell'asse della matrice specificato, equivalente a Max() - Min() |
|
double vector.Percentile(const int percent) double matrix.Percentile(const int percent) vector matrix.Percentile(const int percent,const int axis) |
Restituisce il percentile specificato di valori di elementi matrice/vettore o elementi lungo l'asse specificato. I valori validi del parametro 'percentuale' sono compresi nell'intervallo [0, 100] |
|
double vector.Quantile(const int percent) double matrix.Quantile(const int percent) vector matrix.Quantile(const int percent,const int axis) |
Restituisce il quantile specificato di valori di elementi matrice/vettore o elementi lungo l'asse specificato. Il parametro 'percentuale' assume valori nell'intervallo [0, 1] |
|
double vector.Median() double matrix.Median() vector matrix.Median(const int axis) |
Calcola la mediana degli elementi matrice/vettore. La mediana è il valore medio che separa la metà più alta degli elementi array/vettore dalla metà più bassa degli elementi. |
|
double vector.Average() double matrix.Average() vector matrix.Average(const int axis) |
Calcola la media aritmetica dei valori di matrice/vettore. La somma dei pesi al denominatore non può essere uguale a 0, ma alcuni pesi possono essere 0 |
|
double vector.Std() double matrix.Std() vector matrix.Std(const int axis) |
Restituisce la deviazione standard dei valori degli elementi matrice/vettorie o degli elementi lungo l'asse dato |
|
double vector.Var() double matrix.Var() vector matrix.Var(const int axis) |
Calcola la varianza dei valori degli elementi matrice/vettore |
|
double vector.CorrCoef(const vector& v) matrix matrix.CorrCoef() |
Calcola il coefficiente di correlazione di Pearson (coefficiente di correlazione lineare). Il coefficiente di correlazione è compreso nell'intervallo [-1, 1] |
|
vector vector.Correlate(const vector& v,enum mode) |
Calcola la correlazione incrociata di due vettori. Il parametro 'mode' determina la modalità di calcolo della convoluzione lineare |
|
vector vector.Convolve(const vector& v, enum mode) |
Restituisce la convoluzione lineare e discreta di due vettori Il parametro 'mode' determina la modalità di calcolo della convoluzione lineare |
|
matrix matrix.Cov() matrix vector.Cov(const vector& v); (resulting matrix 2 x 2) |
Calcola la matrice di covarianza. La covarianza di due campioni (due variabili casuali) è una misura della loro dipendenza lineare |