Introduzione ai vettori e alle matrici in MATLAB

Il nome MATLAB sta per MATrix LABoratory, ossia laboratorio per Matrici. Sin da quando è stato concepito, MATLAB ha sempre supportato i vettori e le matrici come tipi fondamentali. Le operazioni stesse che è possibile effettuare su di essi sono parte del linguaggio. Tali operazioni, inoltre, sono alla base per la vettorizzazione del codice che vedremo più avanti.

In questa lezione vedremo come creare vettori e matrici in MATLAB.

Vettori e Matrici

Senza entrare nel dettaglio della definizione matematica, dal punto di vista di un qualunque computer, un vettore e una matrice possono essere visti come delle sequenze di valori dello stesso tipo. Infatti, sono assimilabili agli array negli altri linguaggi di programmazione. Da un punto di vista matematico, questa definizione non è corretta, ma al momento non c'è bisogno di preoccuparsi.

Una Matrice può essere considerata, all'atto pratico, come una tabella di valori dello stesso identico tipo. Essendo una tabella, essa ha righe e colonne. Indichiamo con r e c il numero, rispettivamente, di righe e di colonne e indichiamo con il nome di dimensione della matrice la dicitura r \times c.

Nota: Quando parliamo di dimensione della matrice nell'ambito di MATLAB ci riferiamo semplicemente al numero di righe e di colonne e non intendiamo il concetto matematico avanzato di dimensione di uno spazio vettoriale.

Un esempio di matrice può essere il seguente:

A= \begin{bmatrix} 5 & 9 \\ 7 & 4 \\ \end{bmatrix}

dove abbiamo una matrice di dimensione 2 \times 2, ossia composta da 2 righe e 2 colonne.

Analogamente, a livello pratico, possiamo considerare un vettore come una matrice con una singola colonna o una sola riga. Ad esempio:

B= \begin{bmatrix} 5 \\ 7 \\ 8 \end{bmatrix} \quad C= \begin{bmatrix} 1 & 5 & 9 \\ \end{bmatrix}

In questo caso, il vettore B è un vettore colonna, che può essere considerato come una matrice di dimensione n \times 1, mentre il vettore C è un vettore riga che, a sua volta, può essere considerato come una matrice di dimensione 1 \times n.

Analogamente, anche uno scalare può essere visto come una matrice particolare di dimensione 1 \times 1, ad esempio:

D= \begin{bmatrix} 4 \end{bmatrix}

Tutti i valori memorizzati in queste matrici prendono il nome di elementi.

MATLAB è nato per lavorare direttamente con le matrici, per semplificare il lavoro agli ingegneri e scienziati che lo utilizzano. Per questo motivo, MATLAB tratta vettori e scalari come casi particolari di matrici.

In MATLAB una matrice è equivalente ad un array per gli altri linguaggi di programmazione. Infatti, un vettore può essere visto come un array monodimensionale, mentre una matrice come un array bidimensionale.

Creare un vettore riga

Iniziamo a vedere come è possibile creare un vettore riga in MATLAB.

Esistono diversi modi per farlo, il più semplice è quello di elencare tutti gli elementi del vettore tra parentesi quadre separandoli da uno spazio o da una virgola. Vediamo un esempio:

>> v = [1 2 3 4]

v =

     1     2     3     4

>> v = [1,2,3,4]

v =

     1     2     3     4

Entrambe le scritture di sopra sono equivalenti. Con esse abbiamo creato il vettore v di tipo 1 \times 4.

Se usiamo il comando whos otteniamo il seguente output:

>> whos
  Name      Size            Bytes  Class     Attributes

  v         1x4                32  double              

Come si può osservare, abbiamo creato una variabile v dove la classe è double, la size è di 1x4 e il numero di byte è 32 che equivale a 4 double da 8 byte.

Operatore di iterazione

La tecnica di creazione di vettori riga vista sopra può risultare tediosa e soggetta ad errori per vettori di grandi dimensioni. Se gli elementi del vettore sono equispaziati, MATLAB mette a disposizione l'operatore "due punti" : per creare un vettore, detto anche operatore di iterazione. Vediamo un esempio:

>> v = 10:20

v =

    10    11    12    13    14    15    16    17    18    19    20

Utilizzando la sintassi valore_iniziale : valore_finale abbiamo creato un vettore con tutti gli elementi, da 10 a 20 inclusi, spaziati di 1. Da notare che non sono state necessarie le parentesi quadre.

Il valore di spaziatura 1 prende anche il nome di step value o incremento. Se non indicato, questo valore è automaticamente pari a 1, per cui nell'esempio di sopra il vettore risultante è di 11 elementi (10 e 20 sono inclusi). Possiamo specificare un valore diverso di step value inserendolo tra il valore iniziale e quello finale separando i valori sempre con i due punti:

>> v = 10:2:20

v =

    10    12    14    16    18    20

La sintassi, in questo caso, è valore_iniziale : step_value : valore_finale. Abbiamo scelto uno step value di 2 così che il vettore risultante sia formato da 6 elementi che vanno da 10 a 20 spaziati di 2.

Se, utilizzando l'incremento si ottiene un valore che va al di là del valore finale, la generazione del vettore si interrompe. Ad esempio:

>> v = 1:3:5

v =

     1     4

In questo caso, il vettore risultante è di soli due elementi perchè aggiungendo 3, l'incremento, al valore 4 otteniamo 7 che va oltre il valore finale di 5.

Usando questa notazione possiamo anche utilizzare incrementi negativi. Ad esempio:

>> v = 10:-2:0

v =

    10     8     6     4     2     0

In questo modo il vettore risultante è composto da elementi in ordine decrescente da 10 a 0 spaziati di -2.

Funzioni linspace e logspace

Un altro semplice modo di creare vettori riga è quello di usare la funzione linspace. Attraverso questa funzione possiamo generare un vettore di elementi linearmente spaziati tra un valore iniziale ed uno finale. La sintassi è linspace(start, stop, n). n è il numero di elementi di cui il risultato deve essere composto. Se omesso, vale automaticamente 100. Vediamo un esempio:

>> v = linspace(0, 50, 5)

v =

         0   12.5000   25.0000   37.5000   50.0000

In questo esempio abbiamo creato un vettore di 5 elementi linearmente spaziati tra 0 e 50 inclusi.

Analogamente è possibile creare un vettore con la funzione logspace che genera un vettore di elementi logaritmicamente spaziati tra loro. La sintassi è linspace(x, y, n) e il risultato è un vettore di n elementi compresi tra 10^x e 10^y inclusi. Vediamo un esempio:

>> v = logspace(1, 5, 5)

v =

          10         100        1000       10000      100000

Creare un vettore colonna

Un vettore colonna può essere creato similmente al modo in cui si crea un vettore riga. La differenza sta nell'usare il punto e virgola ; anziché utilizzare la virgola o lo spazio per separare gli elementi. Vediamo un esempio:

>> v = [1;2;3;4]

v =

     1
     2
     3
     4

Se invochiamo il comando whos abbiamo un risultato simile a quello visto sopra:

>> whos
  Name      Size            Bytes  Class     Attributes

  v         4x1                32  double              

A differenza dei vettori riga, però, non esiste un modo per generare un vettore colonna con l'operatore di iterazione : o con le funzioni linspace e logspace. Tuttavia è possibile sempre effettuare l'operazione di trasposizione per trasformare un vettore riga in uno colonna. Per farlo è necessario usare l'operatore di trasposizione ' (il singolo apice). Vediamo un esempio:

>> v_riga = 1:5

v_riga =

     1     2     3     4     5

>> v_colonna = v_riga'

v_colonna =

     1
     2
     3
     4
     5

Analogamente, vale il viceversa, ossia usando sempre l'operatore di trasposizione è possibile trasformare un vettore colonna in uno riga.

Creare una matrice

La creazione di una matrice in MATLAB è semplicemente una generalizzazione delle tecniche usate sopra per creare vettori riga e colonna. Infatti, per creare una matrice è necessario specificare i valori di ogni riga separandoli con spazi o virgole e separare le righe stesse con punti e virgola. Vediamo un esempio:

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

A =

     1     2     3
     4     5     6

In questo esempio abbiamo creato una matrice A di tipo 2 \times 3 usando gli spazi per separare gli elementi delle singole righe e il punto e virgola per separare le righe fra loro.

Se usiamo il comando whos otteniamo il seguente output:

>> whos
  Name      Size            Bytes  Class     Attributes

  A         2x3                48  double              

MATLAB non supporta matrici con righe contenenti diverso numero di elementi. Per cui è necessario sempre inserire lo stesso numero di elementi in ogni riga onde evitare errori:

>> A = [1 2 3; 4 5]
Error using vertcat
Dimensions of arrays being concatenated are not consistent.

Nel creare le matrici è possibile anche usare l'operatore di iterazione visto sopra assicurandosi sempre che il numero di elementi per riga sia identico:

>> A = [1:5;6:10]

A =

     1     2     3     4     5
     6     7     8     9    10

Per creare una matrice è possibile, inoltre, usare il tasto Enter per separare le righe senza dover usare il punto e virgola. Ad esempio:

>> A = [1 2
3 4]

A =

     1     2
     3     4

Funzioni zeros, ones e eye

MATLAB mette a disposizione anche delle funzioni speciali per la creazione di matrici (e vettori).

La prima funzione è zeros che permette di creare matrici composte da soli zeri. Questa funzione accetta al massimo due parametri interi. Se si fornisce un solo parametro, zeros(n), si otterrà una matrice quadrata di ordine n composta da soli zeri. Se si forniscono due parametri, zeros(m, n), si otterrà una matrice di zeri di dimensione m \times n. Vediamo un esempio:

>> A = zeros(3)

A =

     0     0     0
     0     0     0
     0     0     0

>> B = zeros(2, 3)

B =

     0     0     0
     0     0     0

Con questa funzione possiamo anche creare vettori, riga o colonna, di tutti zeri:

>> v_riga = zeros(1, 4)

v_riga =

     0     0     0     0

>> v_colonna = zeros(4, 1)

v_colonna =

     0
     0
     0
     0

La funzione ones è analoga alla funzione zeros, ma la differenza è che genera matrici (o vettori) composte da soli 1. Vediamo un esempio:

>> A = ones(3)

A =

     1     1     1
     1     1     1
     1     1     1

>> B = ones(2, 3)

B =

     1     1     1
     1     1     1

>> v_riga = ones(1, 4)

v_riga =

     1     1     1     1

>> v_colonna = ones(4, 1)

v_colonna =

     1
     1
     1
     1

Infine, un'altra funzione degna di nota per la creazione di matrici è la funzione eye. Questa funzione crea matrici identità, ossia matrici con 1 sulla diagonale principale e richiede in ingresso sia un parametro che due. Nel primo caso creerà una matrice quadrata, nel secondo una matrice rettangolare. Vediamo un esempio:

>> A = eye(3)

A =

     1     0     0
     0     1     0
     0     0     1

>> B = eye(2, 3)

B =

     1     0     0
     0     1     0

Creazione di matrici casuali: rand e randi

In MATLAB è anche possibile generare matrici composte da numeri casuali utilizzando la funzione rand. Attraverso questa funzione è possibile generare matrici quadrate o rettangolari di numeri casuali compresi tra 0 e 1. Per generare matrici quadrate basta specificare come singolo parametro l'ordine della matrice. Viceversa, per matrici rettangolari basta specificare il numero di righe e colonne come parametri. Vediamo un esempio:

>> A = rand(3)

A =

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

>> B = rand(2, 3)

B =

    0.9649    0.9706    0.4854
    0.1576    0.9572    0.8003

Ovviamente è anche possibile creare vettori, riga o colonna, di numeri casuali:

>> v_riga = rand(1, 4)

v_riga =

    0.1419    0.4218    0.9157    0.7922

>> v_colonna = rand(4, 1)

v_colonna =

    0.9595
    0.6557
    0.0357
    0.8491

Per generare, invece, matrici di numeri casuali interi è possibile usare la funzione randi. Questa funzione prende in ingresso l'intervallo di numeri entro il quale generare i valori casuali e le dimensioni (o la singola dimensione) della matrice da generare. Vediamo un esempio:

>> A = randi([-10,10], 4)

A =

   -10     6     3     4
    -1    -7     4     3
    -2     0     5    -7
     6    -1    -5    -8

>> B = randi([-20,20], 2, 3)

B =

     0    -7   -11
    19     3    10

Nel primo caso, abbiamo generato una matrice quadrata di ordine 4 con valori compresi tra -10 e 10 (inclusi). Nel secondo caso una matrice di dimensione 2 \times 3 con valori compresi tra -20 e 20.

Riassumendo

In questa lezione abbiamo visto come in MATLAB è possibile creare vettori riga:

  • Elencando gli elementi separati da virgole o spazi e racchiudendoli tra parentesi quadre.
  • Attraverso l'operatore di iterazione e specificando eventualmente l'incremento o step value.
  • Usando le funzioni linspace o logspace.

Abbiamo poi visto come creare un vettore colonna:

  • Utilizzando il punto e virgola per separare gli elementi
  • Utilizzando l'operatore di trasposizione

Successivamente abbiamo visto come creare le matrici generalizzando le tecniche usate per creare i vettori riga e colonna. Infine abbiamo visto alcune funzioni speciali per la creazione di matrici:

  • zeros
  • ones
  • eye
  • rand
  • randi

Nella prossima lezione vedremo come indicizzare gli elementi di un vettore, ossia come accedere ai suoi elementi e come modificarli.