Le matrici! Utilissime, specialmente grazie ai modelli, alla teoria dei sistemi e all'informatica.
Non andrò nel dettaglio degli argomenti, un bel corso di algebra lineare potrebbe essere utile nel caso.
In questa sezione si espliciterò il connubio tra lo sviluppo di codice e l’algebra lineare, connubio fruttuoso, utilissimo e che darà l’occasione per toccare qualche concetto interessante e qualche geniale intuizione tipica delle applicazioni matematiche che hanno giovato negli ultimi decenni del supporto dell’informatica.
L’idea è quella di avere una classe per la gestione di matrici semplice da usare e con scrittura del codice intuitiva. Come intuibile e facilmente confermabile, ce ne sono molte di librerie, anche con licenza aperta; trovo che siano tutte di norma sovrabbondanti e soprattutto costringano a scrivere del codice poco leggibile e poco intuitivo.
Di certo il codice che troverete non è ottimizzato quanto quello create dalle community o da alcune università, è anche vero che nei miei progetti non ho necessità di utilizzare matrici dimensionalmente “generose”, quindi decade in buona parte la necessità di ottimizzazione degli algoritmi.
L’idea di base era creare qualcosa di facile da codificare e con scrittura quanto più auto-esplicativa in stile Octave.
Troverete classi e strutture con nome esplicativo, principalmente una per i vettori matrice orizzontali/verticali (Vector) con riga/colonna unica e le matrici (Matrix) con più righe/colonne.
La codifica è decisamente intuitiva, quantomeno spero, riporto di seguito delle righe di codice di esempio con relativo commento che spero non serva in quanto il codice dovrebbe essere autoesplicativo.
//Vector class
...
Vector V(5); //Vector of 5 elements declared and instantiated
V.Rands(); //Fill vector with randoms number
S = V + Y; //Sum of vectors
ST = S.T(); //Vector transposed (out vector is a column vector)
...
//Matrix class
...
double in[3][2] = { { 0, 3 }, { 5, 7 }, { 11, 13 } };
Matrix A; //Matrix declared but not instantiated
setMatrix(in,A); //Set matrix given a bidimensional array
A[1][1] = 1.0; //Set a matrix element (first row, first column)
...
AT = A.T(); //Transposed matrix
...
S = AT + B; //Sum of matrices
...
M = A * AT; //Multiplication of matrices (rows per columns)
...
double detM = M.det(); //Determinant of a matrix
...
B = A^-1; //Inverse of a square matrix
...
Qualche nota veloce.
Matrici e vettori (matrici riga/colonna) quando allocati vengono inizializzati con tutti gli elementi a zero.
I vettori di default sono vettori riga.
La matrice viene vista a codice come un array di vettori riga.
Nelle sottosezioni troverete alcune interessanti sezioni che riguardano il calcolo matriciale e sopratutto una breve spiegazione di come implementarne il calcolo, nel dettaglio:
Infine alcune applicazioni.