È 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 lengthPer 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 AL’operatore “\” corrisponde alla divisione sinistra
A \ B corrisponde a \(A^{-1} B\)A, moltiplicata per BL’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 docUn 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>
linspaceUna alternativa ai range è la funzione linspace
Eseguendo la chiamata a funzione:
Viene costruito un vettore tale che:
<primo><ultimo><numero> elementi equispaziatiPer esempio:
linspaceIl 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) \]
1La 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:
endGli 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 trueI due vettori/matrici devono avere la stessa dimensione
B contiene valori logiciVediamo un utilizzo tipico:
V minori di 5Si 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:
.mIn 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.mMantenete 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}) \]
5All’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) \]