È ora di fare una precisazione:
Per Matlab, l’espressione:
10
Del resto, Matlab sta per “MATrix LABoratory”!
Per denotare un matrice si usa la sintassi:
[<dato a>, <dato b>, ...; <dato c>, <dato d>, ...; ...]
,
” è un separatore di colonna;
” è un separatore di rigaLa semantica corrispondente è:
\[ \left(\begin{array}{cc} a & b & \ldots\\ c & d & \ldots\\ \ldots & \ldots & \ldots \end{array}\right) \]
Per esempio, digitando nel prompt dei comandi:
Matlab risponde con:
Un vettore è semplicemente una matrice 1 \(\times\) n o n \(\times\) 1:
Per i vettori riga si può anche usare:
La definizione di vettori/matrici è una espressione composta
Quando scrivete…
…e battete “invio”, Matlab lo interpreta come:
<exp1>
”, “<exp2>
”, “<exp3>
” vengono valutate…2
, 0.75
e 16
[2, 0.75, 16]
Di fatto, è una chiamata a funzione (con sintassi speciale)!
Si può ottenere il numero di elementi in un vettore con:
Per esempio:
length([1, 2, 3]) % Risp: ans = 3
length(10) % Risp: ans = 1
Attenzione:
length
con le matricihelp length
Per ottenere le dimensioni di una matrice potete usare:
size
restituisce un vettore, con il numero di righe e colonne:A = [1, 2, 3; 4, 5, 6] % Corrisponde a [1, 2, 3;
% 4, 5, 6]
B = [1, 2, 3, 4]
C = 10
size(A) % Risp: ans = [2, 3]
size(B) % Risp: ans = [1, 4]
size(C) % Risp: ans = [1, 1]
Una considerazione interessante:
+
”, “*
”, etc.) cosa fanno veramente?Gli operatori aritmetici in Matlab sono operatori matriciali:
+
” calcola la somma di due matrici-
” calcola la differenza di due matrici*
” calcola il prodotto matriciale (riga per colonna)/
” e “^
” meritano qualche parola in piùMa prima, vediamo qualche esempio…
Qualche esempio di applicazione di “+
”, “-
”, “*
”:
A + B % Risp: ans = [5, 5;
% 5, 5]
A - B % Risp: ans = [-3, -1;
% 1, 3]
A * B % Risp: ans = [ 8, 5;
% 20, 13]
A * C % Risp: ans = [10;
% 22]
L’operatore “/
” corrisponde alla divisione destra:
B / A
corrisponde a \(B A^{-1}\)B
, moltiplicata per l’inversa di A
L’operatore “\
” corrisponde alla divisione sinistra
A \ B
corrisponde a \(A^{-1} B\)A
, moltiplicata per B
L’operatore “^
” corrisponde all’esponenziale di matrice:
Quando uno dei termini è uno scalare:
*
si comporta come in matematica:/
e \
anche (in questo caso sono equivalenti!)Cosa succede per gli operatori di confronto?
E per quanto riguarda le funzioni?
A = [1, 2; 3, 4] % Equivale a: [1, 2;
% 3, 4]
exp(A) % Denota: [ 2.7183, 7.3891;
% 20.0855, 54.5982]
sin(A) % Denota: [0.8415, 0.9093
% 0.1411, -0.7568]
Attenzione: non vale in tutti i casi!
help
o doc
Un problema che capita spesso:
A
e B
(o due vettori)…Per questo possiamo usare gli operatori aritmetici “elemento per elemento”:
A .* B % Moltiplica gli elementi uno ad uno
A ./ B % Divide gli elementi uno ad uno
A.^b % b scalare, eleva a potenza gli elementi
*
”, “/
”, “^
”)….*
”, “./
”, “.^
”)Vedrete che li useremo molto spesso
Su matrici/vettori si può applicare l’operatore di trasposizione
Attenzione:
.'
” (con il punto)…'
” calcola il complesso coniugato…Nel caso di matrici di numeri reali, i due coincidono
Funzioni per Costruire Matrici Notevoli:
Vediamo qualche esempio rilevante:
Un range costruisce un vettore di elementi consecutivi
La sintassi è:
Qualche esempio:
1:6
equivale a: [1, 2, 3, 4, 5, 6]
1:2:6
equivale a: [1, 3, 5]
1:2.5:6
equivale a: [1, 3.5, 6]
La costruzione procede finché non si supera il valore <ultimo>
linspace
Una alternativa ai range è la funzione linspace
Eseguendo la chiamata a funzione:
Viene costruito un vettore tale che:
<primo>
<ultimo>
<numero>
elementi equispaziatiPer esempio:
linspace
Il numero di elementi in linspace
può essere omesso:
<numero>
ha 100 come valore di defaultTipicamente:
linspace
quando va bene avere anche numeri realiSi può costruire una matrice o un vettore per concatenazione:
Basta utilizzarli nella notazione per costruire un nuovo vettore/matrice:
A = [1, 2]
B = [3, 4]
[A, B] % Denota [1, 2, 3, 4]
[A; B] % Denota [1, 2;
% 3, 4]
[A', B'] % Denota [1, 3;
% 2, 4]
,
” si concatena per riga;
” si concatena per colonnaSpesso, è utile accedere ad un elemento specifico di un vettore
Ogni elemento di un vettore è associato ad un indice (un intero):
\[ \left(\begin{array}{ccccc} \fbox{1} & \fbox{2} & \fbox{3} & \fbox{4} & \cdots \end{array}\right) \]
1
La notazione:
Restituisce l’elemento di <vettore>
in posizione <indice>
Lo stesso metodo vale per le matrici
In questo caso però si usa un indice doppio:
Vediamo qualche esempio:
Qualche regola sugli indici:
Per accedere all’ultimo elemento ci sono due modi:
end
Gli elementi di un vettore/matrice sono assimilabili a variabili
=
Valgono le stesse regole delle variabili:
=
…
=
…
È possibile assegnare elementi “oltre la fine” di un vettore
Supponiamo di avere:
Se assegniamo ad un indice < 1
, otteniamo un errore:
Ma se usiamo un indice > length(x)
, invece:
0
le celle intermedieIl simbolo []
denota un vettore/matrice vuoto
Possiamo definire un vettore vuoto:
Possiamo estendere un vettore vuoto:
Possiamo cancellare un elemento assegnandovi []
:
L’estensione e []
consentono di manipolare la lunghezza
È possibile accedere ad una matrice con un indice unico
In questo caso, gli elementi si considerano numerati per colonna, e.g.:
\[ \left(\begin{array}{ccc} \fbox{1} & \fbox{4} & \fbox{7} \\ \fbox{2} & \fbox{5} & \fbox{8} \\ \fbox{3} & \fbox{6} & \fbox{9} \end{array}\right) \]
Così, per esempio:
Possiamo accedere ad un sotto-vettore con un vettore di indici:
La sintassi è:
Per esempio:
V
, agli indici 2
e 3
È un metodo particolarmente efficace se si usano i range
Supponiamo di voler sommare le celle adiacenti di:
Supponiamo di voler sommare le celle adiacenti di:
Possiamo usare:
a(1:end-1)
denota [1, 2, 3, 4]
a(2:end)
denota [2, 3, 4, 5]
Il risultato è:
Oppure, supponiamo di voler sommare le celle pari e dispari:
Oppure, supponiamo di voler sommare le celle pari e dispari:
Possiamo usare:
a(1:2:end)
denota [1, 3, 5]
a(2:2:end)
denota [2, 4, 6]
Il risultato è:
Con le matrici possiamo usare due vettori di indici
La sintassi è:
In questo modo viene selezionata una sotto-matrice:
Uno dei due indici può essere non specificato, con “:
”
Per esempio, data:
Possiamo selezionare le prime due righe:
O la seconda colonna:
Infine, possiamo indicizzare mediante valori logici:
A
in corrispondenza dei quali B
contiene true
I due vettori/matrici devono avere la stessa dimensione
B
contiene valori logiciVediamo un utilizzo tipico:
V
minori di 5
Si può anche evitare di usare la variabile B
V < 5
…È possibile assegnare in un solo colpo un sotto-vettore/matrice:
A = [1, 2, 3; 4, 5, 6; 7, 8, 9] % [1, 2, 3;
% 4, 5, 6;
% 7, 8, 9]
A(2:end, 2:end) = [1, 0; 0, 1] % Risp. [1, 2, 3;
% 4, 1, 0,
% 7, 0, 1]
=
”…Il broadcasting è un meccanismo che:
.*
”)…Per esempio:
Viene espanso come (replica di righe/colonne):
\[ \left(\begin{array}{cc} 1 & 1\\ 2 & 2 \end{array}\right) .* \left(\begin{array}{cc} 1 & 3\\ 1 & 3 \end{array}\right) \]
Il broadcasting richiede esperienza per essere utilizzato
Il “quasi” di cui sopra si riferisce ad un caso particolare:
Assegnamento in blocco di uno scalare:
In Matlab, si chiama file di script:
.m
In sostanza, è un file con un programma scritto in Matlab
Un file di script può essere eseguito con la sintassi:
zeta.m
si esegue con zeta
+ [INVIO]Eseguire uno script equivale a scrivere le sue istruzioni sul prompt
Scegliete il nome con un filo di attenzione
pi.m
…pi
+[INVIO]…Soluzione:
es1.m
\(\longrightarrow\) ch4_es1.m
Mantenete il codice leggibile, in particolare:
...
”È possibile inserire commenti nel codice:
Li abbiamo già visti, la sintassi è:
%
” viene ignoratoCommentare è importante: aiuta a ragionare e ricordare
Dal sito del corso, scaricate lo “start-kit” per questa lezione
.zip
in una cartella.zip
…Lo script assegna alla variable VV
il vettore:
\[ (\begin{array}{cccc} 2 & 4 & 6 & 8 \end{array}) \]
…Ed alla variabile AA
la matrice:
\[ \left( \begin{array}{cccc} 1 & 3 & 5 & 7 \\ 9 & 11 & 13 & 15 \\ 17 & 19 & 21 & 23 \\ 25 & 27 & 29 & 31 \end{array} \right) \]
Nello script, provate ad accedere ai seguenti sotto-vettori di VV
:
\[ (\begin{array}{cccc} 2 & 4 & 6 & 8 \end{array}) \]
5
All’occorrenza, utilizzate le modalità di indicizzazione avanzata!
Nello script, provate ad accedere alle seguenti sotto-matrici di AA
:
\[ \left( \begin{array}{cccc} 1 & 3 & 5 & 7 \\ 9 & 11 & 13 & 15 \\ 17 & 19 & 21 & 23 \\ 25 & 27 & 29 & 31 \end{array} \right) \]
[11, 13; 19, 21]
A
, senza la seconda riga e colonnaCalcolate il risultato dell’espressione lineare:
\[ A b + c \]
Dove:
\[\begin{align} A &= \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \end{array} \right) & b &= \left( \begin{array}{c} 1 \\ 2 \\ 3 \\ 4 \end{array} \right) & c &= \left( \begin{array}{c} 0 \\ 1 \\ 0 \\ 1 \end{array} \right) & \end{align}\]
Risoluzione di sistemi di equazioni lineari
\[ Ax = b \]
Consideriamo il sistema:
\[\begin{align} x_1 + x_2 + x_3 &= 2 \\ x_1 + 2 x_2 &= 1 \\ 2x_1 + x_3 &= 0 \end{align}\]
Valutate le seguenti espressioni, per \(x = \left(0, 1, 2, 3, 4, 5 \right)\)
Procedete in questo modo:
Costruite, senza immettere direttamente i valori:
\[ \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \\ 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 4 \end{array} \right) \]
Dovrete usare delle espressioni (o chiamate a funzione)
Costruite, senza immettere i valori uno per uno:
C
identica A
, ma avente V
come prima rigaZ
che contenga \((0, 0, 0, 0, 0, 0)\)Z
modificato in modo che contenga \((0, 1, 0, 1, 0, 1)\)T
così fatta:\[ \left( \begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 \end{array} \right) \]