
La moltiplicazione tra matrici è una delle operazioni fondamentali dell’algebra lineare, con applicazioni che spaziano dall’informatica grafica all’analisi dei dati, dall’ingegneria ai sistemi dinamici. Comprendere come si esegue la moltiplicazione tra matrici, quali proprietà la governano e quali errori evitare permette di risolvere problemi complessi in modo preciso ed efficiente. In questa guida esploreremo dal concetto di base alle tecniche avanzate, offrendo esempi concreti, spiegazioni passo-passo e suggerimenti pratici per l’implementazione.
Cos’è la Moltiplicazione tra matrici
La moltiplicazione tra matrici è un’operazione che combina due strutture rettangolari per ottenere una nuova matrice. Se una matrice A ha dimensioni m × n e una matrice B ha dimensioni n × p, allora la moltiplicazione tra matrici produce una matrice C di dimensioni m × p. L’elemento Cij è ottenuto dal prodotto scalare tra la i‑esima riga di A e la j‑esima colonna di B. In simboli: C = AB, con A ∈ R^{m×n}, B ∈ R^{n×p} e C ∈ R^{m×p}.
Questo non è semplicemente un “prodotto” tra elementi; è un’operazione che mette in relazione righe e colonne per generare nuove informazioni. Perché sia possibile la moltiplicazione tra matrici, serve che il numero di colonne di A sia uguale al numero di righe di B, cioè n. Se questa condizione non è soddisfatta, l’operazione non è definita.
Quando è possibile la Moltiplicazione tra matrici
La condizione cruciale per eseguire la moltiplicazione tra matrici è la compatibilità delle dimensioni. Se A è una matrice di dimensioni m × n e B è una matrice di dimensioni n × p, allora la moltiplicazione tra matrici è definita e il risultato è una matrice C di dimensioni m × p. Viceversa, se le dimensioni non si allineano, l’operazione non è definita e occorre ridefinire le matrici o ricorrere a operazioni equivalenti.
Oltre alle dimensioni, è utile ricordare alcune proprietà comuni che governano l’operazione, come la non commutatività: in generale AB non è uguale a BA e, spesso, hanno dimensioni incompatibili per la seconda moltiplicazione. Per questo motivo la sequenza in cui si eseguono le moltiplicazioni tra matrici è fondamentale nelle strutture algebriche complesse, nei modelli di reti neurali e nelle trasformazioni geometriche.
Proprietà chiave della Moltiplicazione tra matrici
Associatività
La moltiplicazione tra matrici è associativa: se A è m × n, B è n × p e C è p × q, allora (AB)C = A(BC). Questo significa che, nell’ordine di esecuzione, è possibile raggruppare le operazioni senza modificare il risultato finale. L’associatività è una proprietà fondamentale che permette di ottimizzare i calcoli e di costruire catene di trasformazioni complesse in modo modulare.
Distributività
La moltiplicazione tra matrici è distributiva rispetto all’addizione sia a sinistra che a destra: A(B + C) = AB + AC e (A + B)C = AC + BC. Questa proprietà è essenziale quando si lavora con combinazioni lineari di trasformazioni o quando si decomponono problemi complessi in parti gestibili.
Non commutatività
In generale AB ≠ BA. Anche quando entrambe le operazioni sono definite, la seconda moltiplicazione potrebbe non avere lo stesso risultato della prima. Questa caratteristica riflette la natura delle trasformazioni lineari: applicare una trasformazione A e poi una trasformazione B non è equivalente all’applicazione di B seguita da A. Comprendere questa asimmetria è cruciale in moltissimi contesti pratici, come la grafica computerizzata e le reti neurali.
Come si calcola: formula e metodo passo-passo
Definizione matematica
Data A ∈ R^{m×n} e B ∈ R^{n×p}, la matrice prodotto C = AB è definita elemento per elemento come:
Cij = Σk=1^n Aik · Bkj, per ogni i = 1,…,m e j = 1,…,p. In altre parole, ogni elemento di C è la somma dei prodotti tra gli elementi della i‑esima riga di A e della j‑esima colonna di B.
Esempio semplice
Supponiamo di avere due matrici:
A = [[1, 2, 3], [4, 5, 6]] e B = [[7, 8], [9, 10], [11, 12]]
La moltiplicazione tra matrici AB genera una matrice C di dimensioni 2 × 2. Calcoliamo gli elementi:
- C11 = 1·7 + 2·9 + 3·11 = 7 + 18 + 33 = 58
- C12 = 1·8 + 2·10 + 3·12 = 8 + 20 + 36 = 64
- C21 = 4·7 + 5·9 + 6·11 = 28 + 45 + 66 = 139
- C22 = 4·8 + 5·10 + 6·12 = 32 + 50 + 72 = 154
Quindi AB = [[58, 64], [139, 154]].
Esempio numerico concreto: una moltiplicazione tra matrici
Consideriamo una coppia di matrici comune in esempi didattici: A è di dimensioni 2×3 e B è di dimensioni 3×2. Scegliamo:
A = [[2, -1, 3],
[0, 4, 5]]
B = [[1, 0],
[2, 3],
[4, -1]]
La moltiplicazione tra matrici AB porta a C di dimensioni 2×2. Calcolo passo-passo:
- Colonna 1 di B: B(:,1) = [1, 2, 4]^T
- Riga 1 di A: A(1,:) = [2, -1, 3]
- C11 = 2×1 + (-1)×2 + 3×4 = 2 − 2 + 12 = 12
- Colonna 2 di B: B(:,2) = [0, 3, -1]^T
- C12 = 2×0 + (-1)×3 + 3×(-1) = 0 − 3 − 3 = -6
- Riga 2 di A: A(2,:) = [0, 4, 5]
- C21 = 0×1 + 4×2 + 5×4 = 0 + 8 + 20 = 28
- C22 = 0×0 + 4×3 + 5×(-1) = 0 + 12 − 5 = 7
Risultato: AB = [[12, -6], [28, 7]].
import numpy as np
A = np.array([[2, -1, 3],
[0, 4, 5]])
B = np.array([[1, 0],
[2, 3],
[4, -1]])
C = A.dot(B)
print(C)
Algoritmi e complessità: dall’approccio base a Strassen
Algoritmo naive
Il metodo naive o classico per la moltiplicazione tra matrici esegue n somma-p-prodotti per elemento della matrice risultante. La complessità temporale è O(mnp). Questo approccio è semplice e affidabile, ma può diventare costoso per grandi dimensioni, specialmente quando m, n e p sono elevati. In contesti pratici, si ricorre spesso a implementazioni ottimizzate che sfruttano l’architettura hardware e la cache della memoria.
Strassen e altri algoritmi avanzati
Strassen ha dimostrato che è possibile ridurre la complessità di moltiplicazione tra matrici rispetto all’approccio naive, introducendo una strategia di ripartizione ricorsiva che riduce il numero di moltiplicazioni scalari necessarie. In parole semplici, si scambia parte del lavoro di moltiplicazioni con somme e differenze tra sotto-matrici. L’algoritmo di Strassen è più efficiente per matrici molto grandi, ma introduce overhead e può essere meno stabile numericamente rispetto all’approccio classico, specialmente su hardware non ottimale. Esistono altre tecniche, come gli algoritmi di Coppersmith-Winograd e vari miglioramenti moderni, che cercano di ridurre ulteriormente la complessità teorica, ma spesso sono meno pratici per implementazioni standard o per matrici di dimensioni moderate.
Strutture utili: matrice identità, trasposta e inversa
Matrice identità
La matrice identità I è la trasformazione neutra per la moltiplicazione tra matrici: AB = A se B è la matrice identità di dimensioni n × n (A è m × n). Avere una comprensione chiara della matrice identità è utile per risolvere problemi di trasformazione lineare e per impostare condizioni al contorno in sistemi dinamici.
Matrice trasposta
La trasposizione è una operazione che scambia righe e colonne: A^T è la matrice ottenuta scambiando riga e colonna. La trasposta è strettamente legata a concetti come la simmetria, l’ortogonalità e le proprietà spettrali, e gioca un ruolo chiave in diversi contesti di calcolo lineare, tra cui metodi numerici e ottimizzazione. Nota bene: in generale AB non è la stessa come B^T A^T, ma si può utilizzare la relazione (AB)^T = B^T A^T in momenti utili di dimostrazione o semplificazione.
Inversa: criteri e limiti
L’inversa di una matrice A esiste solo se A è quadrata e invertibile (det(A) ≠ 0). Per calcolare l’inversa, spesso si ricorre a decomposizioni come LU, QR o metodi numerici iterativi. Nell’ambito della moltiplicazione tra matrici, la nozione di inversa è importante quando si risolvono sistemi lineari o si compongono trasformazioni, ma non tutte le matrici hanno inversa. Inoltre, la presenza di una inversa non semplifica automaticamente i calcoli: in alcune situazioni si preferisce risolvere sistemi lineari mediante metodi diretti o iterativi invece di calcolare l’inversa esplicitamente, per ragioni di stabilità numerica ed efficienza.
Applicazioni pratiche della Moltiplicazione tra matrici
La moltiplicazione tra matrici è presente in moltissimi ambiti. Alcuni esempi pratici includono:
- Grafica computerizzata: trasformazioni di coordinate, operazioni di proiezione, rotazioni e scalamenti di oggetti nello spazio 3D.
- Reti neurali e apprendimento automatico: trasformazioni lineari nelle layer dense (fully connected), calcolo di attivazioni dopo trasformazioni lineari.
- Sistemi dinamici: modellizzazione di stati, trasformazioni di sistemi nel tempo, controllo e simulazioni di modelli fisici.
- Economia e statistica: trasformazioni di dati, regressioni multiple, internamente si incontrano combinazioni lineari di feature e coefficienti.
- Analisi di segnali e trasformate: applicazioni in cui una trasformazione lineare viene utilizzata per convertire segnali in rappresentazioni utili.
Consigli pratici per implementare la moltiplicazione tra matrici in Python, MATLAB e R
Per chi lavora con calcoli numerici, sapere come implementare la moltiplicazione tra matrici in diversi ambienti è fondamentale. Ecco alcune linee guida rapide per ottenere prestazioni robuste e risultati accurati:
- Python (con NumPy): usare A.dot(B) o np.matmul(A, B) per la moltiplicazione tra matrici. Assicurarsi che le dimensioni siano compatibili (A.shape[1] == B.shape[0]). NumPy sfrutta ottimizzazioni interne e può utilizzare accelerazione hardware.
- MATLAB/Octave: l’operatore di moltiplicazione è semplicemente A * B. In MATLAB, la gestione delle dimensioni è chiara: se A è m×n e B è n×p, la matrice risultante è m×p. È possibile sfruttare anche funzioni come mtimes per eseguire l’operazione in modo esplicito.
- R: l’operazione è simile a A %*% B. R gestisce automaticamente i tipi numerici e può utilizzare pacchetti esterni per accelerare calcoli su grandi matrici.
- Verifiche: prima di moltiplicare, controllare le dimensioni con una stampa rapida o una verifica: se A.shape[1] != B.shape[0], l’operazione non è definita. In ambienti di calcolo numerico, abilitare controlli di overflow e di precisione può evitare errori silenziosi.
- Prestazioni: per matrici grandi, considerare decomposizioni o metodi paralleli. In contesti di deep learning, usare API che sfruttano GPU, come cuBLAS o altre librerie ottimizzate, può ridurre drasticamente i tempi di esecuzione.
Errori comuni da evitare
- Fondazione errata delle dimensioni: cercare di moltiplicare due matrici senza controllo delle dimensioni (m × n) e (p × q) e finire con un errore di dimensioni o con risultati inutili.
- Trascurare la stabilità numerica: operazioni con numeri molto grandi o molto piccoli possono introdurre errori di arrotondamento. In questi casi, è utile lavorare con tipi di precisione maggiore o utilizzare metodi numerici robusti.
- Dipendenza dalla rappresentazione: a volte, convertire dati a una forma non adeguata (per esempio, strutture sparse non pratiche) può generare inefficienze e perdita di memoria. Per dati sparsi, preferire formati e algoritmi progettati per matrici sparse.
- Non considerare la non commutatività: se si presume che BA = AB, si rischia di introdurre errori logici soprattutto in catene di trasformazioni e reti complesse.
- Trascurare la modularità: in progetti complessi, è utile suddividere le operazioni di moltiplicazione tra matrici in componenti riutilizzabili per facilitare manutenzione e debug.
FAQ: Domande frequenti sulla Moltiplicazione tra matrici
Posso moltiplicare due vettori?
La moltiplicazione tra matrici classica richiede due matrici che soddisfino le dimensioni: se un vettore è una matrice riga (1 × n) e l’altro è una matrice colonna (n × 1), allora il prodotto è uno scalare. Se entrambi i vettori hanno dimensioni compatibili ma non sono una riga e una colonna, l’operazione potrebbe non essere definita o potrebbe produrre una forma diversa (per esempio una matrice 1×1 o una matrice n×n a seconda dell’orientamento).
La moltiplicazione tra matrici è sempre definita?
No. L’operazione è definita solo se le dimensioni interne corrispondono: se A è m × n e B è n × p, allora AB è definita e ha dimensioni m × p. Se le dimensioni non si allineano, l’operazione non è definita e occorre riformulare le matrici o scegliere trasformazioni equivalenti.
Qual è la differenza tra prodotto tra matrici e prodotto tra vettori?
Il prodotto tra matrici è un’operazione bilineare che combina due strutture a livello di righe e colonne e produce una nuova matrice. Il prodotto tra vettori può riferirsi a diversi concetti: prodotto scalare (che riduce i vettori a uno scalare), prodotto vettoriale (per vettori nello spazio tridimensionale) o prodotto di una matrice e un vettore. Nel contesto della moltiplicazione tra matrici, spesso si lavora con righe e colonne per costruire la matrice risultante.
Conclusione
La moltiplicazione tra matrici è un pilastro dell’algebra lineare e della matematica applicata, con implicazioni pratiche in quasi ogni disciplina che utilizza trasformazioni lineari. Capire le condizioni di definizione, le proprietà fondamentali, i metodi di calcolo e le applicazioni pratiche permette di risolvere problemi reali in modo più efficiente e accurato. Che si lavori con manipolazione di grafica, analisi di dati o modelli di controllo, padroneggiare la moltiplicazione tra matrici offre una base solida per l’analisi e la progettazione di soluzioni robuste.