Algebra matriciale e linguaggio matriciale in MATLAB
Linguaggio matriciale Come detto, il linguaggio matriciale costituisce il nucleo essenziale della programmazione. Vediamo ora i comandi principali che riguardano creazione e manipolazione delle matrici. Va tenuta a mente una cosa fondamentale: MATLAB lavora su matrici e in tutte le operazioni in cui è possibile utilizzarlo il linguaggio matriciale, anziché codici con loop, if…., risulta di gran lunga il modo più veloce ed efficiente di programmare. Le matrici possono essere registrate: Introducendo un elenco di numeri Creando le matrici in M-files Caricando i dati da files esterni Facendo generare i dati da MATLAB
Linguaggio matriciale Consideriamo l’inserimento manuale di dati nel command di MATLAB; sono tre le indicazioni da seguire: Gli elementi della matrice devono essere racchiusi tra parentesi quadre [] Gli elementi di una stessa riga vanno separati da uno spazio Il passaggio da una riga all’altra avviene con il punto e virgola Quindi per registrare la matrice 1 2 -6 4 -4 5 che chiamiamo “A” va digitato nel command
Linguaggio matriciale A=[1 2 -6; 4 -4 5] e invio. Per ottenere un elemento della matrice, va indicata tra parentesi tonde la posizione dello stesso nel modo seguente: m = A(2,2) e invio ottenendo così l’elemento che occupa la posizione 2,2 nella matrice A. Se commettessimo l’errore di digitare n = A(2,6) e invio avremmo un messaggio di errore, date le dimensioni della nostra matrice.
Linguaggio matriciale Il comportamento di MATLAB non è invece lo stesso se si immagazzina un nuovo numero in una posizione che, per le dimensioni di partenza della matrice, non dovrebbe esistere. Se infatti digitiamo: A(2,4)=7 e invio attribuiamo valore 7 all’elemento di posizione (2,4), che non esisterebbe date le dimensioni (2x3) della matrice. MATLAB allora “allarga” la matrice, inserendo l’elemento 7 nella posizione scelta e ponendo zeri nella colonna (o riga) che è stata aggiunta.
Linguaggio matriciale Tra gli operatori matriciali, ruolo importante è attribuito ai due punti “:” , che indica Tutta la riga o colonna A(1,:) e invio fornisce come output tutti gli elementi della prima riga Tutte le colonne/righe da .. a … A(1 , 2:3) e invio fornisce come output tutti gli elementi della prima riga e delle colonne dalla seconda alla terza
Linguaggio matriciale Un utilizzo altrettanto fondamentale è quello di servire per costituire una sequenza, nel modo start:step:stop ossia viene creata in un vettore riga una sequenza di numeri che iniziano dal numero start, vengono incrementati del valore step e si fermano quando raggiungono lo stop. Ad esempio 1:2:20 e invio crea una sequenza di valori che partono da 1 e vengono incrementati di 2 fino ad arrivare a 20: 1 3 5 …… 19. Se non indicato, il passo di default è 1.
Operazioni con le matrici Data una qualsiasi matrice, possiamo facilmente trasporla con l’apostrofo: B=A’ e invio Data una matrice quadrata, possiamo ottenere il suo determinante con la funzione det(): d = det(matr) e invio L’operatore diag() estrae invece gli elementi della diagonale principale: v=diag(A) e invio tale operazione è applicabile anche a matrici non quadrate.
Operazioni con le matrici Un operatore di fondamentale utilizzo è sum(), che somma gli elementi della matrice. L’operazione di somma avviene di default per colonna, ma è altresì possibile effettuarla per riga specificando sum(matrice,2). Analogo è il comando prod, che applica il prodotto. L’operatore inv() inverte una matrice quadrata non singolare Quindi se definiamo la matrice Z: 2 5 -3 7 -2 4 8 -5 6 possiamo trasporla,estrarne la diagonale principale, calcolarne il determinante e ottenere un vettore che sommi per riga e uno che contenga la somma per colonna con i seguenti comandi:
Operazioni con le matrici Ztr=Z’ Dt = det(Z) V = diag(Z) Vs1=sum(Z) Vs2=sum(Z,2) Le operazioni di somma e sottrazione tra matrici si ottengono con i simboli “+” e “–” e consistono nella somma e sottrazione degli elementi di una matrice con il corrisponente elemento dell’altra, nell’ipotesi che le dimensioni delle matrici coincidano altrimenti il messaggio di errore è ??? Errar using => + Matrix dimension must agree
Operazioni con le matrici L’operazione di prodotto tra matrici si effettua con “*”, e può avvenire solo se il numero di colonne della prima matrice = numero di righe della seconda. Se la condizione non viene rispettata il messaggio di errore è ??? Errar using => * Inner matrix dimension must agree L’operazione di prodotto tra matrici elemento per elemento si effettua con “.*”, e può avvenire solo se le due matrici hanno uguale dimensione, poiché moltiplica ogni elemento della prima per il corrispondente della seconda. L’elevamento a potenza di un elemento si ha con “^”. Applicato ad una matrice quadrata la moltiplica per sé stessa. L’elevamento a potenza elemento per elemento di una qualsiasi matrice si ha con “.^”. Con esso si eleva ogni elemento della matrice alla potenza.
Concatenazione di matrici Due matrici con ugual numero di righe possono essere concatenate orizzontalmente, cioè affiancate orizzontalmente per formare una matrice unica. Definite A (2x3) e B (2x4), possiamo definire C (2x7) come la matrice che otteniamo affiancandole con le parentesi quadre e lo spazio. Quindi le trattiamo come gli elementi di una matrice: >> C=[A B]; Due matrici con ugual numero di colonne possono essere concatenate verticalmente, cioè affiancate verticalmente per formare una matrice unica. Definite D (2x3) e F (4x3), possiamo E (6x3) come la matrice che otteniamo affiancandole con le parentesi quadre e il punto e virgola. Quindi scriviamo: >> E=[D ; F];
Matrici fondamentali Le tre matrici più importanti per la programmazione sono le matrici di zeri e di uno, ottenibili con i comandi: zeros(i,j), che permette di creare una matrice di zeri con i righe e j colonne ones(i,j), che permette di creare una matrice di tutti uno con i righe e j colonne eye(i,j), che permette di creare una matrice di i righe e j colonne con uno sulla diagonale principale e zero altrove
Matrici fondamentali Se per esempio dobbiamo creare una matrice 3x4 con tutti 5, possiamo applicare la moltiplicazione scalare ed usare il comando precedente digitando: >> M=5*ones(3,4);
Altri comandi fondamentali Length(v): calcolato su di un vettore o su una serie, ne dà la lunghezza Size(m): calcolato su di una matrice, ne dà numero di righe e di colonne; in particolare size(m) => numero righe e colonne size(m,1) => numero di righe size(m,2) => numero di colonne
Altri comandi fondamentali È possibile cancellare righe e colonne di una matrice utilizzando le parentesi quadre [], attribuendole alla riga/colonna che si vuole cancellare. Facendo >> m = ones(3,4); >> m(:,4) = [] ho cancellato la quarta colonna di m. Ovviamente non è possibile scrivere >> m(2,2)=[] altrimenti starei cancellando un solo elemento e m non sarebbe più una matrice! Reshape(X,M,N) considera una matrice X e dà come output una matrice di MxN elementi presi da X partendo dalla prima colonna. Se X non ha ugual numero di elementi (MxN) fornisce un messaggio di errore.
Altri comandi Altri comandi utilizzabili in ambito matriciale sono: abs() => calcola il valore assoluto di un numero o la matrice contenente i valori assoluti della matrice cui è applicato fix() => tronca un numero all’intero round() => calcola l’arrotondamento per eccesso/difetto max() e min()=> calcola di un vettore il max o min elemento; di una matrice produce un vettore con il max o min degli elementi per colonne fliplr() => inverte l’ordine degli elementi di un vettore
Altri comandi norm() => calcola la norma 2 di un vettore o matrice eig() => calcola gli autovalori di una matrice quadrata rank(), che calcola il rango di una matrice trace(), che calcola la traccia di una matrice cumprod(x) restituisce un vettore o una matrice con il prodotto cumulato per colonna cumsum(x) restituisce un vettore o una matrice con la somma cumulata per colonna