Dimensioni di Matrici e Vettori in MATLAB

In questa lezione vedremo come lavorare con le dimensioni di vettori e matrici in MATLAB.

Vedremo come ricavare il numero di elementi di un vettore e come richiedere il numero di righe e colonne di una matrice.

Inoltre, studieremo delle tecniche per creare matrici e vettori a partire da matrici di partenza modificandone le dimensioni. Nel dettaglio vedremo:

  • Come trasporre una matrice;
  • Come capovolgere un vettore o una matrice;
  • Come ruotare una matrice;
  • Come replicare il contenuto di un vettore o di una matrice.

Determinare le dimensioni di Matrici e Vettori

Nello sviluppo di programmi MATLAB spesso sorge l'esigenza di determinare le dimensioni di matrici e vettori in maniera tale da poter applicare funzioni e calcoli differenti a seconda dei casi. Per far questo, MATLAB mette a disposizione una serie di funzioni che, richiamate su vettori o matrici, ne restituiscono la dimensione o il numero di elementi.

Vediamo queste funzioni nel dettaglio

Funzione length

La funzione length può essere utilizzata per ottenere il numero di elementi di un vettore.

Ad esempio, se introduciamo i seguenti comandi nel prompt di MATLAB, otteniamo il risultato mostrato:

>> v = [0:10];
>> length(v)

ans =

    11

In questo caso abbiamo creato un vettore con l'operatore di iterazione. Il vettore contiene gli elementi da zero a 10 con un passo di 1, per cui ha 11 elementi. Richiamando la funzione length su di esso, otteniamo il risultato 11.

La funzione length può essere richiamata anche su valori scalari. Ovviamente, in tal caso, il risultato sarà sempre 1, come nell'esempio che segue:

>> x = 5;
>> length(x)

ans =

     1

In questo caso, la variabile x è un semplice double, quindi un valore scalare. La funzione length richiamata su di esso restituisce 1, come c'era da aspettarsi.

Se richiamata su di una matrica, invece, la funzione length si comporta in maniera differente. Osserviamo l'esempio che segue:

>> M1 = [1 2 3; 4 5 6]

M1 =

     1     2     3
     4     5     6

>> M2 = [1 2; 3 4; 5 6]

M2 =

     1     2
     3     4
     5     6

>> length(M1)

ans =

     3

>> length(M2)

ans =

     3

In questo esempio, la matrice M1 ha una dimensione 2x3, ossia due righe e tre colonne. Invece, la matrice M2 ha una dimensione 3x2, ossia tre righe e due colonne.

Invocando la funzione length su entrambe le matrici, otteniamo sempre lo stesso risultato, ossia 3. Questo perchè, se invochiamo la funzione length su di una matrice, otterremo sempre la dimensione più grande tra le due. In altre parole, length restituirà sempre il maggiore tra il numero di righe e il numero di colonne. Per cui, ricapitolando:

Definizione

Funzione length

La funzione length restituisce il numero di elementi di un vettore.

Se invocata su di un valore scalare, la funzione length restituirà sempre 1.

Se invocata su di una matrice, la funzione length restituirà la dimensione maggiore tra il numero di righe e il numero di colonne.

Funzione size

La funzione size può essere utilizzata per ricavare il numero di righe e di colonne di una matrice o di un vettore.

Partiamo da un caso semplice: invochiamo size su un vettore.

>> v = [1:4]

v =

     1     2     3     4

>> size(v)

ans =

     1     4

In questo caso, il vettore v è un vettore riga di 4 elementi. Possiamo considerarlo come una matrice 1x4. Per cui, invocando size sul vettore otteniamo due risultati: 1 e 4. Il primo rappresenta il numero di righe, il secondo il numero di colonne.

La peculiarità di size è che si tratta di una funzione che restituisce un vettore. Infatti, se eseguiamo i comandi che seguono:

>> v = 1:4;
>> x = size(v);
>> x

x =

     1     4

>> whos
  Name      Size            Bytes  Class     Attributes

  v         1x4                32  double              
  x         1x2                16  double              

Il risultato di size è, appunto, un vettore di due elementi.

Proviamo a richiamare size su di una matrice:

>> M1 = [1 2; 3 4; 5 6]

M1 =

     1     2
     3     4
     5     6

>> size(M1)

ans =

     3     2

Come si può osservare, size restituisce 3 e 2, ossia il numero di righe e il numero di colonne della matrice M1.

Possiamo anche estrarre direttamente questi due valori salvandoli in due variabili differenti. La sintassi per far questo è la seguente:

>> [r c] = size(M1)

r =

     3


c =

     2

Usando questa sintassi, MATLAB andrà a salvare il primo elemento del risultato di size, ossia il numero di righe, nella variabile r, mentre il secondo elemento nella variabile c, ossia il numero di colonne.

Ovviamente, se applichiamo size ad uno scalare otterremo il risultato 1 1:

>> size(5)

ans =

     1     1

Ricapitolando:

Definizione

Funzione size

La funzione size restituisce un vettore contenente il numero di righe e il numero di colonne della matrice o del vettore passato in ingresso.

Se invocata su di un valore scalare, la funzione length restituirà sempre il vettore [1 1].

Funzione numel

Un'altra importante funzione che MATLAB mette a disposizione è numel. Con questa funzione è possibile ottenere il numero totale di elementi di un vettore o di una matrice. Del resto il nome sta per "number of elements".

Ad esempio, se invochiamo numel su di una matrice 3x2 otteniamo il seguente risultato:

>> M1 = [1 2 3; 4 5 6]

M1 =

     1     2     3
     4     5     6

>> numel(M1)

ans =

     6

Abbiamo ottenuto, come risultato, il valore 6 che corrisponde al numero di righe per il numero di colonne della matrice M1 e, quindi, il numero totale di elementi.

Ovviamente, se applicata ad un vettore il risultato sarà del tutto identico al risultato della funzione length:

>> v = [1 2 3 4]

v =

     1     2     3     4

>> numel(v)

ans =

     4

>> length(v)

ans =

     4

Ricapitolando:

Definizione

Funzione numel

La funzione numel restituisce il numero totale di elementi di una matrice, ossia il prodotto tra il numero di righe e il numero di colonne.

Se invocata su di un vettore, questa funzione restituisce un risultato identico alla funzione length.

Cambiare le dimensioni di Matrici e Vettori

In MATLAB vettori e matrici non sono oggetti immutabili. Abbiamo già visto che è possibile modificarne i valori. Abbiamo anche visto come aggiungere elementi.

Quello che vedremo adesso è come creare nuove matrici e vettori modificando la dimensione di matrici e vettori di input. Per far questo è possibile utilizzare tecniche diverse che hanno effetti differenti.

Operatori di trasposizione

In MATLAB è possibile trasporre vettori e matrici. Abbiamo già intravisto come fare quando abbiamo studiato la creazione di vettori colonna. In quel caso abbiamo usato l'operatore di trasposizione che ora analizzeremo nel dettaglio.

Per trasporre una matrice, ossia scambiarne righe con colonne è sufficiente usare l'operatore di trasposizione, ossia l'apice '. Ad esempio, volendo trasporre la matrice M1 possiamo introdurre i seguenti comandi:

>> M1 = [1 2 3 4; 5 6 7 8; 9 10 11 12]

M1 =

     1     2     3     4
     5     6     7     8
     9    10    11    12

>> M1'

ans =

     1     5     9
     2     6    10
     3     7    11
     4     8    12

Se la matrice di partenza era una matrice 3x4, il risultato sarà una matrice 4x3, infatti:

>> size(M1)

ans =

     3     4

>> size(M1')

ans =

     4     3

Invece di usare l'operatore di trasposizione, è possibile utilizzare la funzione transpose che effettua le stesse operazioni:

>> M1'

ans =

     1     5     9
     2     6    10
     3     7    11
     4     8    12

>> transpose(M1)

ans =

     1     5     9
     2     6    10
     3     7    11
     4     8    12

In MATLAB esiste, tuttavia, un secondo operatore di trasposizione: .' Si scrive come un punto seguito dall'apice. Questo operatore è del tutto identico all'operatore di trasposizione eccetto nel caso in cui gli elementi della matrice siano valori complessi.

La differenza, infatti, è che l'operatore di trasposizione ' applicato ad una matrice complessa restituisce la matrice trasposta coniugata, quindi tutti i valori sono uguali ai valori di partenza complessi ma coniugati. Viceversa, il secondo operatore non applica l'operazione di coniugato complesso.

Proviamo a chiarire con un esempio:

>> M1 = [1 + 2j, 3 + 4j; 5 + 6j, 7 + 8j; 9 + 10j, 11 + 12j]

M1 =

   1.0000 + 2.0000i   3.0000 + 4.0000i
   5.0000 + 6.0000i   7.0000 + 8.0000i
   9.0000 +10.0000i  11.0000 +12.0000i

>> M1'

ans =

   1.0000 - 2.0000i   5.0000 - 6.0000i   9.0000 -10.0000i
   3.0000 - 4.0000i   7.0000 - 8.0000i  11.0000 -12.0000i

>> M1.'

ans =

   1.0000 + 2.0000i   5.0000 + 6.0000i   9.0000 +10.0000i
   3.0000 + 4.0000i   7.0000 + 8.0000i  11.0000 +12.0000i

Come si evince dall'esempio, nel primo caso gli elementi della matrice di output sono i complessi coniugati degli elementi di partenza. Nel secondo caso, invece, gli elementi sono identici.

Ricapitolando:

Definizione

Operatori di trasposizione

MATLAB mette a disposizione due operatori di trasposizione per le matrici:

  1. ': traspone la matrice scambiando righe e colonne. Se la matrice è composta da valori complessi, il risultato sarà composto dai coniugati complessi degli elementi di partenza.
  2. .': traspone la matrice. Gli elementi del risultato saranno uguali agli elementi di partenza anche nel caso in cui siano valori complessi.

Per il primo operatore, ', si può, alternativamente, utilizzare anche la funzione transpose.

Funzione reshape

La funzione reshape prende una matrice o un vettore in ingresso e restituisce in uscita una matrice o un vettore con gli stessi valori ma con dimensione differente. Il vincolo è che la matrice di uscita abbia lo stesso numero di elementi della matrice di ingresso.

Il nome della funzione deriva dal fatto che la forma (in inglese shape) della matrice di uscita è diversa.

Per comprendere meglio, analizziamo l'esempio che segue:

>> M1 = [1 2 3 4; 5 6 7 8; 9 10 11 12];
>> M1

M1 =

     1     2     3     4
     5     6     7     8
     9    10    11    12

>> M2 = reshape(M1, 2, 6)

M2 =

     1     9     6     3    11     8
     5     2    10     7     4    12

In questo esempio, la matrice M1 ha una dimensione 3x4, quindi ha 12 elementi. Utilizzando reshape possiamo creare una nuova matrice, nell'esempio M2, che ha lo stesso numero di elementi. In particolare, M2 è una matrice 2x6. Quindi abbiamo invocato reshape con la matrice di partenza, M1, il nuovo numero di righe e di colonne.

La cosa importante da notare è che la nuova matrice ha gli stessi valori della matrice di partenza ma in posizioni differenti. Nel dettaglio, gli elementi vengono presi in ordine per colonna.

La funzione reshape può essere applicata anche ai vettori. Ad esempio, possiamo ridimensionare un vettore di 6 elementi in una matrice 3x2:

>> v = [2:2:12]

v =

     2     4     6     8    10    12

>> reshape(v, 3, 2)

ans =

     2     8
     4    10
     6    12

Ricapitolando:

Definizione

Funzione reshape

La funzione reshape prende in ingresso una matrice M1 e due dimensioni r e c:

M2 = reshape(M1, r, c);

e in uscita restituisce una matrice M2 con un numero di righe pari a r e un numero di colonne pari a c. In questa matrice gli elementi sono gli stessi elementi di M1 presi in ordine per colonna. Il vincolo è che il prodotto di r per c sia uguale al numero di elementi di M1.

Funzioni fliplr, flipud e flip

MATLAB mette a disposizione delle funzioni per capovolgere le matrici, in ingles flip. Ne esistono 3 versioni.

La prima è fliplr, ossia flip left to righ, che capovolge da sinistra a destra. In poche parole, questa funzione prende in ingresso una matrice e restituisce una matrice delle stesse dimensioni dove le colonne sono state spostate in maniera tale che la prima diventi l'ultima, la seconda diventi la penultima e così via.

Per comprendere meglio, osserviamo l'esempio:

>> M1 = [1 2 3 4; 5 6 7 8; 9 10 11 12]

M1 =

     1     2     3     4
     5     6     7     8
     9    10    11    12

>> fliplr(M1)

ans =

     4     3     2     1
     8     7     6     5
    12    11    10     9

La seconda funzione è flipud, ossia flip up to down: capovolge la matrice da sopra a sotto. Nel dettaglio, questa funzione prende in ingresso una matrice e restituisce una matrice delle stesse dimensioni dove le colonne sono state capovolte verticalmente.

Di seguito un esempio di utilizzo di flipud:

>> M1 = [1 2 3 4; 5 6 7 8; 9 10 11 12]

M1 =

     1     2     3     4
     5     6     7     8
     9    10    11    12

>> flipud(M1)

ans =

     9    10    11    12
     5     6     7     8
     1     2     3     4

L'ultima funzione di capovolgimento è flip, usata principalmente per i vettori. Se applicata ad un vettore riga, flip restituisce un vettore capovolto da destra a sinistra. Viceversa, se applicata ad un vettore colonna, la funzione capovolge il vettore da sopra a sotto.

Per chiarire meglio, guardiamo l'esempio che segue in cui due vettori, un vettore riga ed uno colonna, sono capovolti con la funzione flip:

>> v1 = [1 2 3 4 5]

v1 =

     1     2     3     4     5

>> flip(v1)

ans =

     5     4     3     2     1

>> v2 = v1'

v2 =

     1
     2
     3
     4
     5

>> flip(v2)

ans =

     5
     4
     3
     2
     1

Se applichiamo la funzione flip ad una matrice, essa si comporta esattamente come la funzione flipud: capovolge la matrice da sopra a sotto. Ad esempio:

>> M1 = [1 2 3 4; 5 6 7 8; 9 10 11 12]

M1 =

     1     2     3     4
     5     6     7     8
     9    10    11    12

>> flip(M1)

ans =

     9    10    11    12
     5     6     7     8
     1     2     3     4

Ricapitolando:

Definizione

Funzioni di capovolgimento

MATLAB mette a disposizione tre funzioni per capovolgere, ossia modificare l'ordine di righe e colonne, di una matrice o di un vettore. Queste funzioni prendono in ingresso una matrice (o un vettore) e restituiscono una matrice (o un vettore) delle stesse dimensioni.

  • fliplr capovolge la matrice da sinistra a destra: flip left to right;
  • flipud capovolge la matrice da sopra a sotto: flip up to down;
  • flip capovolge i vettori. Se usata sulle matrici ha lo stesso effetto di flipud.

Funzione rot90

La funzione rot90 serve per ruotare di 90 gradi in senso antiorario una matrice. In particolare, presa una matrice M1 in ingresso, restituisce una matrice M2 dove i numeri di righe e colonne sono invertiti. Inoltre, M2 avrà come prima riga l'ultima colonna di M1, come seconda riga la penultima colonna di M1 e così via.

Proviamo a chiarire con un esempio. Definiamo una matrice M1:

>> M1 = [1 2 3 4; 5 6 7 8; 9 10 11 12]

M1 =

     1     2     3     4
     5     6     7     8
     9    10    11    12

>> size(M1)

ans =

     3     4

Dall'esempio si può vedere che la matrice M1 ha una dimensione 3x4. Applichiamo, adesso, la funzione rot90 sulla matrice M1 per ottenere M2:

>> M2 = rot90(M1)

M2 =

     4     8    12
     3     7    11
     2     6    10
     1     5     9

>> size(M2)

ans =

     4     3

Abbiamo ottenuto una matrice, M2, di dimensione 4x3, ossia con i numeri di righe e colonne invertite rispetto a M1. Osserviamo la prima riga di M2:

>> M2(1,:)

ans =

     4     8    12

Questa riga contiene esattamente i valori dell'ultima colonna di M2:

>> M1(:,end)

ans =

     4
     8
    12

In sostanza, rot90 ha ruotato la matrice M1 in senso antiorario di 90 gradi.

La funzione rot90 permette anche di specificare un parametro ulteriore: il numero di rotazioni. Questo parametro n, che deve essere intero, specifica il numero di rotazioni di 90 gradi da effettuare. Ad esempio, volendo ruotare di 180 gradi la matrice M1 possiamo inserire il seguente comando:

>> rot90(M1, 2)

ans =

    12    11    10     9
     8     7     6     5
     4     3     2     1

Possiamo anche specificare un numero di rotazioni negativo. In questo modo le rotazioni avvengono in senso orario. Ad esempio, volendo ruotare M1 di 90 gradi in senso orario possiamo inserire il seguente comando:

>> rot90(M1, -1)

ans =

     9     5     1
    10     6     2
    11     7     3
    12     8     4

Ricapitolando:

Definizione

Funzione rot90

La funzione rot90 prende in ingresso una matrice e restituisce in uscita una nuova matrice uguale alla prima ma ruotata di 90 gradi. Questa funzione esiste in due forme.

La prima forma:

rot90(M)

che ruota la matrice M di 90 gradi in senso antiorario.

La seconda:

rot90(M, n)

che ruota la matrice di 90 gradi n volte. Se n è positivo le rotazioni sono in senso antiorario. Viceversa, se n è negativo le rotazioni sono in senso orario.

Funzione repmat e repelem

MATLAB mette a disposizione due funzioni per replicare il contenuto di una matrice o di un vettore.

La prima funzione è repmat che sta per replica matrice. Questa funzione prende in ingresso tre parametri: la matrice di partenza M, e due scalari m e n. Il risultato sarà una nuova matrice di m per n repliche di M.

Prendiamo l'esempio che segue:

>> M1 = [1 2; 3 4]

M1 =

     1     2
     3     4

>> M2 = repmat(M1, 2, 3)

M2 =

     1     2     1     2     1     2
     3     4     3     4     3     4
     1     2     1     2     1     2
     3     4     3     4     3     4

>> size(M2)

ans =

     4     6

In questo esempio, la matrice di partenza M1 ha una dimensione 2x2. Alla funzione repmat abbiamo passato, come parametri, i valori 2 e 3. Il risultato sarà, quindi, una matrice composta da 2 per 3 ripetizioni di M1. In altri termini, M1 verrà replicata 2 volte in verticale e tre volte in orizzontale. Il risultato finale, la matrice M2, ha numero di righe pari ad m per il numero di righe di M1, mentre ha come numero di colonne n per il numero di colonne di M1.

La seconda funzione è repelem che sta per replica elementi. Con questa funzione, ogni elemento viene replicato m per n volte. Per cui, il risultato sarà composto da vari blocchi di elementi replicati di dimensione m per n.

Osserviamo l'esempio:

>> M1 = [1 2; 3 4]

M1 =

     1     2
     3     4

>> M2 = repelem(M1, 2, 3)

M2 =

     1     1     1     2     2     2
     1     1     1     2     2     2
     3     3     3     4     4     4
     3     3     3     4     4     4

>> size(M2)

ans =

     4     6

Come possiamo osservare, M2 è composta da 4 blocchi di elementi uguali. Ogni blocco ha dimensione 2x3 come specificato nei parametri di repelem. Inoltre, ogni blocco è composto da tanti elementi uguali pari agli elementi della matrice di partenza.

Ricapitolando:

Definizione

Funzioni di replicazione

In MATLAB è possibile costruire delle matrici replicando gli elementi di una matrice attraverso le funzioni repmat e repelem.

La funzione repmat richiede tre parametri:

repmat(M, m, n)

Il risultato sarà una matrice composta da m per n ripetizioni della matrice M.

La funzione repelem richiede tre parametri:

repelem(M, m, n)

Il risultato sarà una matrice composta da blocchi di elementi m per n uguali agli elementi replicati della matrice di partenza M.

In Sintesi

Questa lezione ci ha mostrato come lavorare con le dimensioni di matrici e vettori in MATLAB.

Abbiamo visto come ricavare il numero di elementi e le dimensioni di matrici e vettori usando:

  • la funzione length per ricavare il numero di elementi di un vettore o la dimensione massima di una matrice;
  • la funzione size per ottenere le dimensioni di matrici e vettori;
  • la funzione numel che restituisce il numero totale degli elementi di matrici e vettori.

Successivamente, abbiamo visto come creare nuove matrici modificando le dimensioni di matrici di partenza:

  • Attraverso la trasposizione;
  • Modificando la forma con la funzione reshape;
  • Capovolgendo matrici e vettori con la funzioni flip, fliplr e flipud;
  • Ruotando le matrici con la funzione rot90;
  • Replicando le matrici con le funzioni repmat e repelem.

Nella prossima lezione vedremo come cancellare gli elementi di una matrice o di un vettore.