Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Le matrici nell'ambiente di MATLAB

Questo argomento contiene un'introduzione alla creazione di matrici e all'esecuzione di calcoli di base sulle matrici in MATLAB®.

L'ambiente di MATLAB utilizza il termine matrice per indicare una variabile con numeri reali o complessi disposti in una griglia bidimensionale. Un array è, più in generale, un vettore, una matrice o una griglia di numeri di maggiori dimensioni. Tutti gli array in MATLAB sono rettangolari, nel senso che i vettori che lo compongono, lungo ogni dimensione, presentano tutti la stessa lunghezza. Le operazioni matematiche definite sulle matrici sono oggetto dell'algebra lineare.

Creazione di matrici

MATLAB presenta numerose funzioni che creano tipi diversi di matrici. Ad esempio, è possibile creare una matrice simmetrica con elementi basati sul triangolo di Pascal:

A = pascal(3)
A =
       1     1     1
       1     2     3
       1     3     6

È anche possibile creare una matrice di un quadrato magico asimmetrica, con somme uguali per le righe e le colonne:

B = magic(3)
B =
       8     1     6
       3     5     7
       4     9     2

Un altro esempio è una matrice rettangolare 3x2 di numeri interi casuali. In questo caso il primo input in randi descrive il range di valori possibili per i numeri interi, mentre i due input successivi descrivono il numero delle righe e delle colonne.

C = randi(10,3,2)
C =

     9    10
    10     7
     2     1

Un vettore colonna è una matrice mx1, un vettore riga è una matrice 1xn e uno scalare è una matrice 1x1. Per definire manualmente una matrice, utilizzare le parentesi quadre [ ] per indicare l'inizio e la fine di un array. All'interno delle parentesi utilizzare un punto e virgola ; per indicare la fine di una riga. Gli scalari (matrice 1x1) non richiedono parentesi. Ad esempio, queste dichiarazioni producono un vettore colonna, un vettore riga e uno scalare:

u = [3; 1; 4]

v = [2 0 -1]

s = 7
u =
       3
       1
       4

v =
       2     0    -1

s =
       7

Per maggiori informazioni su come creare matrici e sulle relative operazioni, vedere Creating, Concatenating, and Expanding Matrices.

Somma e sottrazione di matrici

La somma e la sottrazione di matrici e array viene eseguita un elemento per volta, o in modalità orientata verso gli elementi. Ad esempio, aggiungendo A a B e quindi sottraendo A dal risultato, si ottiene B:

X = A + B
X =
       9     2     7
       4     7    10
       5    12     8
Y = X - A
Y =
       8     1     6
       3     5     7
       4     9     2

La somma e la sottrazione richiedono che entrambe le matrici presentino dimensioni compatibili. Se le dimensioni non sono compatibili viene generato un errore:

X = A + C
Error using  + 
Matrix dimensions must agree.

Per maggiori informazioni, vedere Array vs. Matrix Operations.

Prodotti e trasposizioni di vettori

Un vettore riga e un vettore colonna della stessa lunghezza possono essere moltiplicati in qualsiasi ordine. Il risultato è o uno scalare, denominato prodotto interno, o una matrice, denominata prodotto esterno:

u = [3; 1; 4];
v = [2 0 -1];
x = v*u
x =

     2
X = u*v
X =

     6     0    -3
     2     0    -1
     8     0    -4

Per le matrici reali, l'operazione di trasposizione scambia aij e aji. Per le matrici complesse occorre considerare anche se utilizzare il coniugato complesso degli elementi complessi nell'array per formare il trasposto complesso coniugato. MATLAB utilizza l'operatore apostrofo (') per eseguire un trasposto complesso coniugato e l'operatore punto-apostrofo (.') per il trasporto senza coniugazione. I due operatori restituiscono lo stesso risultato in caso di matrici che contengono tutti elementi reali.

La matrice dell'esempio A = pascal(3) è simmetrica, quindi A' è uguale ad A. B = magic(3) invece non è simmetrica, quindi B' presenta gli elementi riflessi lungo la diagonale principale:

B = magic(3)
B =

     8     1     6
     3     5     7
     4     9     2
X = B'
X =

     8     3     4
     1     5     9
     6     7     2

Per i vettori, la trasposizione trasforma un vettore riga in vettore colonna e viceversa:

x = v'

x =
       2
       0
      -1

Se sia x che y sono vettori colonna reali, il prodotto x*y non è definito, ma i due prodotti

x'*y

e

y'*x

generano lo stesso risultato scalare. Questa quantità viene utilizzata tanto di frequente da presentare tre nomi diversi: prodotto interno, prodotto scalare o prodotto punto. È disponibile persino una funzione dedicata per i prodotti punto, dal nome dot.

Per le matrici o i vettori complessi z, la quantità z' non traspone solo il vettore o la matrice, ma converte anche ogni elemento complesso nel corrispettivo coniugato complesso. Ciò significa che cambia il segno della parte immaginaria di ogni elemento complesso. Si consideri ad esempio la matrice complessa

z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]
z =

   1.0000 + 2.0000i   7.0000 - 3.0000i   3.0000 + 4.0000i
   6.0000 - 2.0000i   0.0000 + 9.0000i   4.0000 + 7.0000i

Il trasposto complesso coniugato di z è:

z'
ans =

   1.0000 - 2.0000i   6.0000 + 2.0000i
   7.0000 + 3.0000i   0.0000 - 9.0000i
   3.0000 - 4.0000i   4.0000 - 7.0000i

Il trasposto complesso non coniugato, in cui viene mantenuto il segno della parte complessa di ciascun elemento, è denotato con z.':

z.'
ans =

   1.0000 + 2.0000i   6.0000 - 2.0000i
   7.0000 - 3.0000i   0.0000 + 9.0000i
   3.0000 + 4.0000i   4.0000 + 7.0000i

Per i vettori complessi, i due prodotti scalari x'*y e y'*x sono coniugati complessi l'uno dell'altro e il prodotto scalare x'*x di un vettore complesso rispetto a se stesso è reale.

Moltiplicazione di matrici

La moltiplicazione di matrici è definita in modo da riflettere la composizione delle trasformazioni lineari sottostanti e da consentire la rappresentazione compatta di sistemi di equazioni lineari simultanee. Il prodotto di matrice C = AB è definito quando la dimensione della colonna di A è uguale alla dimensione della riga di B, oppure quando uno di questi elementi è uno scalare. Se A è mxp e B è pxn, il loro prodotto C è mxn. Il prodotto in realtà può essere definito con i loop MATLAB for, con la notazione colon e con i prodotti punto del vettore:

A = pascal(3);
B = magic(3);
m = 3; 
n = 3;
for i = 1:m
     for j = 1:n
        C(i,j) = A(i,:)*B(:,j);
     end
end

MATLAB utilizza un asterisco per denotare la moltiplicazione di matrici, come in C = A*B. La moltiplicazione di matrici non è commutativa; A*B infatti non è uguale a B*A:

X = A*B
X =
      15    15    15
      26    38    26
      41    70    39
Y = B*A
Y =
      15    28    47
      15    34    60
      15    28    43

Una matrice può essere moltiplicata sulla destra da un vettore colonna e sulla sinistra da un vettore riga:

u = [3; 1; 4];
x = A*u
x =

     8
    17
    30
v = [2 0 -1];
y = v*B
y =

    12    -7    10

Le moltiplicazioni di matrici rettangolari devono soddisfare la condizione di compatibilità delle dimensioni. Poiché A è 3x3 e C è 3x2, è possibile moltiplicarli per ottenere un risultato 3x2, (la dimensione interna comune viene annullata):

X = A*C
X =

    24    17
    47    42
    79    77

La moltiplicazione tuttavia non funziona nell'ordine inverso:

Y = C*A
Error using  * 
Incorrect dimensions for matrix multiplication. Check that the number of columns 
in the first matrix matches the number of rows in the second matrix. To perform 
elementwise multiplication, use '.*'.

È possibile moltiplicare qualsiasi elemento con uno scalare:

s = 10;
w = s*y
w =

   120   -70   100

Quando si moltiplica un array per uno scalare, quest'ultimo si espande implicitamente per presentare le stesse dimensioni dell'altro input. Questo spesso prende il nome di espansione scalare.

Matrici di identità

La notazione matematica generalmente accettata utilizza la lettera maiuscola I per la denotazione di matrici di identità, cioè matrici di varie dimensioni con diversi elementi uno sulla diagonale principale ed elementi zero altrove. La proprietà di queste matrici è: AI = A e IA = A, quando le dimensioni sono compatibili.

La versione originale di MATLAB non consentiva l'uso di I a questo scopo perché non distingueva tra maiuscole e minuscole e i serviva già come pedice e come unità complessa. Il problema è stato risolto con un gioco di parole in lingua inglese fondato sulla medesima pronuncia dei termini I e eye. La funzione

eye(m,n)

restituisce una matrice identità rettangolaremxn, mentre eye(n) restituisce una matrice identità quadratanxn.

Inverso delle matrici

Se una matrice A è quadrata e non singolare (con determinante non zero), le equazioni AX = I e XA = I generano la stessa soluzione X. Questa soluzione è detta inverso di A ed è denotata con A-1. Sia la funzione inv che l'espressione A^-1 calcolano l'inverso della matrice.

A = pascal(3)
A =
       1     1     1
       1     2     3
       1     3     6
X = inv(A)
X =

    3.0000   -3.0000    1.0000
   -3.0000    5.0000   -2.0000
    1.0000   -2.0000    1.0000
A*X
ans =

    1.0000         0         0
    0.0000    1.0000   -0.0000
   -0.0000    0.0000    1.0000

Il determinante calcolato da det è una misura del fattore di scala della trasformazione lineare descritto dalla matrice. Quando il determinante è esattamente zero, la matrice è singolare e non ammette inversi.

d = det(A)
d =

     1

Alcune matrici sono quasi singolari e, nonostante il fatto che ammettano un inverso, il calcolo è soggetto a errori numerici. La funzione cond calcola il numero di condizionamento per l'inversione, che offre un'indicazione dell'accuratezza dei risultati dell'inversione della matrice. Il numero di condizionamento va da 1 per una matrice numericamente stabile a Inf per una matrice singolare.

c = cond(A)
c =

   61.9839

Raramente è necessario formare l'inverso esplicito di una matrice. Un utilizzo improprio frequente di inv si verifica quando si risolve il sistema di equazioni lineari Ax = b. Il metodo migliore per risolvere questa equazione, dal punto di vista sia del tempo di esecuzione, sia dell'accuratezza numerica, consiste nell'utilizzare l'operatore barra rovesciata x = A\b. Per maggiori informazioni consultare mldivide.

Prodotto tensoriale di Kronecker

Il prodotto di Kronecker, kron(X,Y), di due matrici è la matrice più grande formata da tutti i prodotti possibili degli elementi di X con quelli di Y. Se X è mxn e Y è pxq, allora kron(X,Y) è mpxnq. Gli elementi sono disposti in modo che ciascun elemento di X sia moltiplicato per l'intera matrice Y:

[X(1,1)*Y  X(1,2)*Y  . . .  X(1,n)*Y
                     . . .
 X(m,1)*Y  X(m,2)*Y  . . .  X(m,n)*Y]

Il prodotto di Kronecker è spesso utilizzato con matrici di zero e uno per realizzare copie ripetute di matrici più piccole. Ad esempio, se X è la matrice 2x2

X = [1   2
     3   4]

e I = eye(2,2) è la matrice di identità 2x2, allora:

kron(X,I)
ans =

     1     0     2     0
     0     1     0     2
     3     0     4     0
     0     3     0     4

e

kron(I,X)
ans =

     1     2     0     0
     3     4     0     0
     0     0     1     2
     0     0     3     4

A parte kron, alcune altre funzioni utili per replicare gli array sono repmat, repelem e blkdiag.

Norme di vettori e di matrici

La norma p di un vettore x,

xp=(|xi|p)1p,

si calcola con norm(x,p). Questa operazione è definita per qualsiasi valore di p > 1, ma i valori più diffusi dip sono 1, 2 e ∞. Il valore predefinito è p = 2, che corrisponde alla lunghezza euclidea o magnitudine di un vettore:

v = [2 0 -1];
[norm(v,1) norm(v) norm(v,inf)]
ans =

    3.0000    2.2361    2.0000

La norma p di un vettore A,

Ap=maxxAxpxp,

può essere calcolata per p = 1, 2 e ∞ con norm(A,p). Ancora una volta il valore predefinito è p = 2:

A = pascal(3);
[norm(A,1) norm(A) norm(A,inf)]
ans =

   10.0000    7.8730   10.0000

Per calcolare la norma di ciascuna riga o colonna di una matrice utilizzare vecnorm:

vecnorm(A)
ans =

    1.7321    3.7417    6.7823

Utilizzo del calcolo multithread con le funzioni dell'algebra lineare

MATLAB supporta il calcolo multithread per diverse funzioni numeriche dell'algebra lineare e orientate agli elementi. Queste funzioni vengono eseguite automaticamente su più thread. Per una maggior rapidità di esecuzione di una funzione o espressione su più CPU, occorre soddisfare una serie di condizioni:

  1. La funzione deve eseguire operazioni facilmente ripartibili in sezioni eseguibili contemporaneamente. Queste sezioni devono poter essere eseguite con poche comunicazioni tra i processi. Devono richiedere poche operazioni sequenziali.

  2. Le dimensioni dei dati devono essere sufficientemente grandi, in modo che i vantaggi dell'esecuzione simultanea giustifichino il tempo richiesto per la partizione dei dati e la gestione di thread di esecuzione distinti. Ad esempio, la maggior parte delle funzioni risulta velocizzata solo quando gli array contengono almeno diverse migliaia di elementi.

  3. L'operazione non è vincolata alla memoria; il tempo di accesso alla memoria non deve costituire la maggior parte del tempo di elaborazione. Come regola generale, le funzioni complesse sono più velocizzabili rispetto alle funzioni semplici.

Gli operatori di moltiplicazione delle matrici (X*Y) e di elevazione a potenza delle matrici (X^p) mostrano un notevole aumento della velocità sugli array con doppia precisione (nell'ordine dei 10.000 elementi). Anche le funzioni di analisi delle matrici det, rcond, hess e expm mostrano un notevole aumento della velocità sui grandi array con doppia precisione.

Argomenti complementari

Siti web esterni