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:

Definizione

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
Definizione

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
Definizione

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 i sarà pari alla somma di tutti gli elementi del vettore di input fino all'indice i.

In altre parole, se il vettore di ingresso ha n elementi ed è composto in questo modo:

v_i = \left[ a_1, a_2, a_3, \dots, a_n \right]

Il risultato sarà:

\texttt{cumsum} \left( v_i \right) = v_o = \left[ a_1, (a_1 + a_2), (a_1 + a_2 + a_3), \dots, (a_1 + a_2 + a_3 + \dots + a_n) \right]

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: 1. Il secondo è la somma tra il primo e il secondo: 1 + 2 = 3. Il terzo è pari alla somma dei primi 3: 1 + 2 + 3= 6. E così via.

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.

Definizione

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.