Vettori e Matrici come Argomenti di Funzione in MATLAB
In questa lezione vedremo come usare funzioni matematiche sui vettori e le matrici in MATLAB.
In particolare, vedremo come si comportano le funzioni scalari su un vettore ed una matrice. Esse eseguiranno i calcoli su tutti gli elementi del vettore o della matrice di ingresso restituendo un vettore o una matrice delle stesse dimensioni.
Esistono anche funzioni pensate specificatamente per vettori e matrici che restituiscono un valore che dipende da tutti gli elementi dell'input. In questa lezione ne studieremo alcune.
Infine, esistono funzioni cumulative che applicate a vettori e matrici restituiscono, oltre ad un risultato globale, anche i risultati parziali.
Vettori, Matrici e Funzioni Scalari
Nella lezione sulle funzioni elementari abbiamo visto che MATLAB mette a disposizione una serie di funzioni matematiche, da quelle trigonometriche a quelle trascendentali e così via.
In quella lezione abbiamo usato queste funzioni su valori singoli, ossia su valori scalari. MATLAB semplifica l'utilizzo di queste funzioni permettendo di applicarle anche a vettori e matrici.
Quando una funzione è richiamata su di un vettore o su di una matrice, la funzione viene valutata su ogni singolo elemento dell'input. Il risultato sarà, quindi, un vettore o una matrice delle stesse dimensioni i cui elementi sono il risultato dell'applicazione della funzione sui corrispondenti elementi dell'input.
Partiamo da una funzione semplice: abs
. Questa funzione può essere utilizzata per calcolare il valore assoluto dell'input. Se applicata ad un vettore o ad una matrice, restituirà in uscita un vettore o una matrice delle stesse dimensioni i cui elementi sono il valore assoluto degli elementi di input.
Basta osservare il seguente esempio:
>> A = -10.0 + (20.0).*rand(3)
A =
-2.1555 4.1209 -9.0766
3.1096 -9.3633 -8.0574
-6.5763 -4.4615 6.4692
>> abs(A)
ans =
2.1555 4.1209 9.0766
3.1096 9.3633 8.0574
6.5763 4.4615 6.4692
In questo esempio, abbiamo generato una matrice, A
, 3x3 con valori casuali distribuiti in maniera uniforme tra -10 e 10. Successivamente, abbiamo richiamato la funzione abs
per ottenere il valore assoluto dei suoi elementi. Come si può osservare, l'output è sempre una matrice 3x3 i cui elementi sono i valori assoluti dei corrispondenti elementi della matrice di input A
.
Un altro esempio è la funzion sin
per calcolare il seno di un valore in radianti. Possiamo richiamare la funzione sulla matrice A
in questo modo:
>> sin(A)
ans =
-0.8339 -0.8301 -0.3412
0.0320 -0.0614 -0.9794
-0.2889 0.9687 0.1849
Il risultato è una matrice composta dall'applicazione della funzione sin
su tutti gli elementi della matrice di partenza A
.
Quindi, ricapitolando:
Matrici e Vettori come argomenti di funzioni matematiche scalari
Quando una funzione matematica scalare viene invocata su di un vettore o una matrice, essa restituirà un vettore o una matrice delle stesse dimensioni i cui elementi sono il risultato dell'applicazione della funzione stessa sugli elementi di ingresso.
Funzioni specifiche per matrici e vettori
Le funzioni matematiche viste in precedenza, come abs
e sin
, possono lavorare sia su argomenti scalari che vettoriali comportandosi di conseguenza.
Esistono, tuttavia, funzioni specificatamente pensate per lavorare su matrici e vettori. Tipicamente, queste funzioni lavorano su vettori restituendone un risultato scalare, oppure su matrici considerando le singole colonne come vettori su cui operare.
Di tali funzioni ne esistono moltissime. In questa lezione ne studieremo alcune più rappresentative.
Funzioni min
e max
Le due funzioni min
e max
trovano il minimo e il massimo valore contenuto in un vettore. Ad esempio:
>> v = -10.0 + (20.0).*rand(10, 1)
v =
3.8966
-3.6580
9.0044
-9.3111
-1.2251
-2.3688
5.3103
5.9040
-6.2625
-0.2047
>> min(v)
ans =
-9.3111
>> max(v)
ans =
9.0044
In questo esempio abbiamo generato un vettore v
di 10 valori uniformemente distribuiti tra -10 e 10. Di questo vettore abbiamo trovato il minimo e il massimo.
Richiamando le funzioni min
e max
su di una matrice il comportamento è leggermente differente. In tal caso, le funzioni restituiscono il minimo e il massimo per ogni colonna. Per cui, il risultato sarà un vettore di massimi e minimi di dimensione pari al numero di colonne. Guardiamo l'esempio che segue:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
-1.0883 5.0937 3.1020 -0.0327
2.9263 -4.4795 -6.7478 9.1949
4.1873 3.5941 -7.6200 -3.1923
>> min(A)
ans =
-1.0883 -4.4795 -7.6200 -3.1923
>> max(A)
ans =
4.1873 5.0937 3.1020 9.1949
Come si evince dall'esempio, abbiamo generato una matrice casuale 3x4, quindi composta da 4 colonne. Le funzioni min
e max
hanno restituito entrambe un vettore di 4 elementi, pari al numero di colonne della matrice di input. Ogni vettore contiene il minimo e il massimo di ogni colonna.
Per ottenere il minimo e il massimo di ogni riga, invece, possiamo semplicemente trasporre la matrice:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
-2.9668 0.9945 5.1440 1.3564
6.6166 8.3439 5.0746 -8.4829
1.7053 -4.2832 -2.3911 -8.9210
>> min(A')
ans =
-2.9668 -8.4829 -8.9210
>> max(A')
ans =
5.1440 8.3439 1.7053
Infine, volendo trovare il minimo e il massimo globali di una matrice, basta richiamare due volte la funzione stessa. Infatti, si tratta di applicare nuovamente la funzione min
e max
sul vettore risultante dei massimi e minimi per colonna. Ad esempio:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
0.6160 -7.4019 -9.7620 5.8857
5.5833 1.3765 -3.2575 -3.7757
8.6802 -0.6122 -6.7564 0.5707
>> min(min(A))
ans =
-9.7620
>> max(max(A))
ans =
8.6802
Funzioni min
e max
Le funzioni min
e max
applicate ad un vettore restituiscono, rispettivamente, il minimo e massimo valore del vettore stesso.
Tali funzioni, applicate ad una matrice, restituiscono un vettore contenente, rispettivamente, i valori minimi e massimi delle colonne della matrice.
Funzioni sum
e prod
Queste due funzioni, sum
e prod
, calcolano, rispettivamente, la somma totale degli elementi di un vettore e il prodotto totale degli elementi.
Vediamo un esempio:
>> v = -10.0 + (20.0).*rand(10, 1)
v =
1.7054
-5.5238
5.0253
-4.8981
0.1191
3.9815
7.8181
9.1858
0.9443
-7.2275
>> sum(v)
ans =
11.1302
>> prod(v)
ans =
-5.3911e+04
Analogamente al caso di min
e max
, queste due funzioni, se applicate ad una matrice, calcolano la somma totale e il prodotto totale degli elementi delle singole colonne.
Ad esempio:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
-7.0141 -4.9144 8.5853 -4.9783
-4.8498 6.2857 -3.0003 2.3209
6.8143 -5.1295 -6.0681 -0.5342
>> sum(A)
ans =
-5.0496 -3.7582 -0.4831 -3.1917
>> prod(A)
ans =
231.8058 158.4511 156.3057 6.1725
Anche in questo caso abbiamo ottenuto due vettori composti da 4 elementi pari al numero di colonne della matrice A
di input.
Analogamente, possiamo calcolare la somma totale e il prodotto totale degli elementi delle righe semplicemente trasponendo la matrice. Ad esempio:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
-6.6870 3.0816 -0.9892 8.2667
2.0396 3.7843 -8.3236 -6.9524
-4.7406 4.9630 -5.4205 6.5163
>> sum(A')
ans =
3.6721 -9.4521 1.3183
>> prod(A')
ans =
168.5045 446.6678 831.0323
Infine, possiamo calcolare la somma totale e il prodotto totale di tutti gli elementi della matrice applicando due volte la funzione desiderata. Ad esempio:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
0.7668 -1.1464 -9.9073 7.3739
9.9227 -7.8669 5.4982 -8.3113
-8.4365 9.2380 6.3461 -2.0043
>> sum(sum(A))
ans =
1.4729
>> prod(prod(A))
ans =
2.2712e+08
Funzioni sum
e prod
Le funzioni sum
e prod
applicate ad un vettore restituiscono, rispettivamente, la somma totale e il prodotto totale degli elementi del vettore stesso.
Tali funzioni, applicate ad una matrice, restituiscono un vettore contenente, rispettivamente, la somma totale e il prodotto totale delle colonne della matrice.
Funzioni cumulative
Esistono anche funzioni cumulative, ossia funzioni che, anche lavorando su matrici e vettori, restituiscono i risultati parziali.
Un primo esempio è la funzione cumsum
, ossia somma cumulativa. Questa funzione, se applicata ad un vettore, si comporta similmente alla funzione sum
ma il risultato sarà un vettore. In questo vettore ogni elemento con indice
In altre parole, se il vettore di ingresso ha
Il risultato sarà:
Quindi il vettore di uscita avrà sempre un numero di elementi pari al vettore di ingresso. Gli elementi saranno le somme parziali, incluso l'ultimo che rappresenta la somma totale di tutti gli elementi.
Proviamo con un esempio:
>> v = [1 2 3 4 5]
v =
1 2 3 4 5
>> cumsum(v)
ans =
1 3 6 10 15
>> sum(v)
ans =
15
Come si può osservare, il risultato di cumsum
è sempre un vettore di 5 elementi. Ogni elemento è una somma parziale. Il primo è semplicemente pari al primo elemento:
L'ultimo elemento sarà la somma totale ed infatti è pari al risultato di sum(v)
: 15.
Analogamente esistono anche le funzioni cumprod
, cummin
e cummax
:
>> v = -10.0 + (20.0).*rand(10, 1)
v =
-4.8026
6.0014
-1.3717
8.2130
-6.3631
-4.7239
-7.0892
-7.2786
7.3858
1.5941
>> cumprod(v)
ans =
1.0e+06 *
-0.0000
-0.0000
0.0000
0.0003
-0.0021
0.0098
-0.0692
0.5036
3.7197
5.9296
>> cummin(v)
ans =
-4.8026
-4.8026
-4.8026
-4.8026
-6.3631
-6.3631
-7.0892
-7.2786
-7.2786
-7.2786
>> cummax(v)
ans =
-4.8026
6.0014
6.0014
8.2130
8.2130
8.2130
8.2130
8.2130
8.2130
8.2130
Queste funzioni calcolano:
cumprod
: prodotto cumulativo. Calcola il vettore dei prodotti parziali;cummin
: minimo cumulativo. Calcola il vettore dei minimi parziali;cummax
: massimo cumulativo. Calcola il vettore dei massimi parziali.
Se invochiamo queste funzioni su di una matrice, otterremo in uscita sempre una matrice delle stesse dimensioni dove, però, ogni colonna è composta dall'insieme dei risultati parziali dell'operazione applicata alla colonna di partenza.
Per capire il funzionamento, basta osservare l'esempio che segue:
>> A = -10.0 + (20.0).*rand(3, 4)
A =
0.9972 2.4411 -1.9638 -7.5336
-7.1009 -2.9810 -8.4807 -6.3218
7.0606 0.2650 -5.2017 -5.2009
>> cumsum(A)
ans =
0.9972 2.4411 -1.9638 -7.5336
-6.1037 -0.5398 -10.4445 -13.8555
0.9569 -0.2749 -15.6462 -19.0564
>> sum(A)
ans =
0.9569 -0.2749 -15.6462 -19.0564
>> cumprod(A)
ans =
0.9972 2.4411 -1.9638 -7.5336
-7.0811 -7.2768 16.6547 47.6264
-49.9966 -1.9283 -86.6322 -247.7024
>> prod(A)
ans =
-49.9966 -1.9283 -86.6322 -247.7024
>> cummin(A)
ans =
0.9972 2.4411 -1.9638 -7.5336
-7.1009 -2.9810 -8.4807 -7.5336
-7.1009 -2.9810 -8.4807 -7.5336
>> min(A)
ans =
-7.1009 -2.9810 -8.4807 -7.5336
>> cummax(A)
ans =
0.9972 2.4411 -1.9638 -7.5336
0.9972 2.4411 -1.9638 -6.3218
7.0606 2.4411 -1.9638 -5.2009
>> max(A)
ans =
7.0606 2.4411 -1.9638 -5.2009
Come si può evincere dall'esempio, il risultato delle funzioni non cumulative è pari all'ultima riga del risultato delle funzioni in versione cumulativa.
Funzioni cumulative cumsum
, cumprod
, cummin
e cummax
Le funzioni cumsum
, cumprod
, cummin
e cummax
sono le versioni cumulative, rispettivamente, delle funzioni sum
, prod
, min
e max
. Come tali si comportano allo stesso modo ma restituiscono anche i risultati parziali delle rispettive computazioni.
In sintesi
In questa funzione abbiamo visto cosa accade quando invochiamo una funzione matematica specifica per valori scalari su di un vettore o su di una matrice in MATLAB. Il risultato sarà un vettore o una matrice delle stesse dimensioni dell'input in cui ogni elemento è pari alla funzione richiamata sui singoli elementi di partenza.
Esistono anche funzioni vettoriali, ossia specifiche per lavorare su vettori. Abbiamo visto le quattro funzioni:
min
: funzione che trova il valore minimo di un vettore;max
: funzione che trova il valore massimo di un vettore;sum
: funzione che calcola la somma totale degli elementi di un vettore;prod
: funzione che calcola il prodotto totale degli elementi di un vettore.
Ne esistono molte altre, ma in questa lezione ci siamo concentrati su queste quattro.
Se invocate su di una matrice, queste quattro funzioni considerano le singole colonne della matrice come vettori singoli e il risultato sarà un vettore di dimensione pari al numero di colonne della matrice.
Esistono anche funzioni cumulative che, oltre a calcolare il risultato, restituiscono un vettore con i risultati parziali. Abbiamo studiato quattro funzioni cumulative di esempio:
cummin
: funzione che trova il valore minimo di un vettore;cummax
: funzione che trova il valore massimo di un vettore;cumsum
: funzione che calcola la somma totale degli elementi di un vettore;cumprod
: funzione che calcola il prodotto totale degli elementi di un vettore.