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
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:
dove abbiamo una matrice di dimensione
Analogamente, a livello pratico, possiamo considerare un vettore come una matrice con una singola colonna o una sola riga. Ad esempio:
In questo caso, il vettore B è un vettore colonna, che può essere considerato come una matrice di dimensione
Analogamente, anche uno scalare può essere visto come una matrice particolare di dimensione
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
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
>> 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
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 zeros(m, n)
, si otterrà una matrice di zeri di dimensione
>> 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
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
ologspace
.
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.