# DirectX/Calcolo matriciale

DirectX
Copertina Tutti i moduli · Sviluppo
    CopertinaDirectX/Copertina
* Ripasso di matematicaDirectX/Ripasso di matematica
** Calcolo vettorialeDirectX/Calcolo vettoriale
** Calcolo matricialeDirectX/Calcolo matriciale
** TrasformazioniDirectX/Trasformazioni
* Creare il progetto con VS2010DirectX/Creare il progetto con VS2010
* InizializzazioneDirectX/Inizializzazione
** Win32
*** Creare la finestraDirectX/Creare la finestra
*** Terminale di debugDirectX/Terminale di debug
*** Message loopDirectX/Message loop
*** Altre funzioni Win32DirectX/Altre funzioni Win32
Modifica il sommario
Una matrice è una tabella rettangolare di numeri reali. Ogni matrice è composta da m righe e n colonne. Ogni elemento nella matrice occupa una determinata posizione (i,j). Il numero degli elementi della matrice si ottiene moltiplicando m per n. Per trovare un oggetto nella matrice lo identifichiamo con la coppia di coordinate. L'elemento alla posizione (i,j) della matrice M sarà M$_{i,j}$, dove i è la riga, e j la colonna.
Ecco alcuni esempi di matrici:
$A={\begin{bmatrix}M_{1,1}&M_{1,2}&M_{1,3}\\M_{2,1}&M_{2,2}&M_{2,3}\\M_{3,1}&M_{3,2}&M_{3,3}\\M_{4,1}&M_{4,2}&M_{4,3}\end{bmatrix}}B={\begin{bmatrix}0&3.14&3.5\\24&7.5&0\\1.5&7.9&4.4\end{bmatrix}}C={\begin{bmatrix}1&5&3.5\end{bmatrix}}D={\begin{bmatrix}1\\5\\3.5\end{bmatrix}}$
Mentre A è una matrice generica, B è una matrice speciale e viene detta quadrata, ossia quando m = n. Anche C e D hanno particolarità: per C, m = 1, e viene detto vettore (o matrice) riga, D invece ha n = 1 ed è detto vettore/matrice colonna.

## Operazioni tra matrici

Le operazioni tra matrici sono molto simili a quelle tra vettori:
* Uguaglianza: due matrici sono uguali se per ogni elemento (i,j) della prima matrice, l'elemento (i,j) della seconda matrice ha lo stesso valore:
$\forall x_{i,j}\in M,\ M=N\iff M_{i,j}=N_{i,j}$
L'uguaglianza può essere verificata solo per due matrici con lo stesso numero di righe e colonne.
* Somma: la somma si esegue elemento per elemento. Può essere calcolata solo per matrici con lo stesso numero di righe e colonne. Il risultato della somma tra due matrici è quindi una terza matrice in cui ogni elemento è la somma degli elementi nella stessa posizione delle matrici originarie:
    ${\begin{bmatrix}1&3.4\\2.2&3\end{bmatrix}}+{\begin{bmatrix}4.5&1.2\\3.13&5.78\end{bmatrix}}={\begin{bmatrix}1+4.5&3.4+1.2\\2.2+3.13&3+5.78\end{bmatrix}}={\begin{bmatrix}5.5&4.6\\5.33&8.78\end{bmatrix}}$
* Prodotto per scalare': come per i vettori, il prodotto tra una matrice ed uno scalare è una matrice in cui tutti gli elementi sono stati moltiplicati per lo scalare.
* Sottrazione: come per i vettori, viene definita in termini di addizione e prodotto per scalare. In particolare date M ed N matrici, M - N = M + (-1N).

### Prodotto tra matrici

Questa operazione non ha simili tra i vettori ed è molto complessa. Può essere eseguita solo se il numero di colonne della prima matrice è uguale a quello delle righe della seconda. Date due matrici M ed N, il loro prodotto sarà una terza matrice in cui ogni elemento (i, j) è il prodotto scalare (vedi i vettori) tra il vettore riga i della matrice M ed il vettore colonna j della seconda matrice. Esempio:
$A={\begin{bmatrix}2&3&-3\\1&-4&2\end{bmatrix}}B={\begin{bmatrix}1&5&2\\-3&1&4\\2&0&5\end{bmatrix}}$
Il prodotto AB è definito dato che A ha un numero di colonne pari al numero di righe di B. Si calcola in questo modo:
$AB={\begin{bmatrix}(2,3,-3)\cdot (1,-3,2)&(2,3,-3)\cdot (5,1,0)&(2,3,-3)\cdot (2,4,5)\\(1,-4,2)\cdot (1,-3,2)&(1,-4,2)\cdot (5,1,0)&(1,-4,2)\cdot (2,4,5)\end{bmatrix}}={\begin{bmatrix}2*1+3*-3+-3*2&2*5+3*1+-3*0&2*2+3*4+-3*5\\1*1+-4*-3+2*2&1*5+-4*1+2*0&1*2+-4*4+2*5\end{bmatrix}}={\begin{bmatrix}-13&13&1\\17&1&-4\end{bmatrix}}$
Questa operazione gode della proprietà associativa ma non commutativa. Quindi $(AB)C=A(BC)$. Ma $AB\neq BA$

### Prodotto tra vettore e matrice

Il prodotto tra vettore e matrice è possibile solo quando il numero di elementi nel vettore è uguale al numero di righe della matrice. Il prodotto tra vettore e matrice è un vettore di tanti elementi quanti nel primo vettore. Dato un vettore di n elementi, il vettore risultante sarà la somma di n vettori tali che: il primo vettore è il prodotto tra il valore scalare alla posizione 1 del vettore ed il vettore riga n. 1 della matrice, il secondo è il prodotto tra l'elemento del vettore alla posizione 2 e il vettore riga n. 2 della matrice. In altre parole: $v\cdot m=v_{1}\cdot m_{1,\bullet }+v_{2}\cdot m_{2,\bullet }+\cdots +v_{n}\cdot m_{n,\bullet }$ dove $m_{n,\bullet }$ indica il vettore riga numero n.

## Matrici particolari
### Matrice identità

La matrice identità è la matrice che moltiplicata per qualsiasi altra matrice (dove la moltiplicazione è applicabile) la lascia inalterata. La matrice identità è sempre quadrata ed è composta da tutti zeri tranne la diagonale che va da (0, 0) a (n, n), dove n è il numero di righe e colonne della matrice stessa, che sarà invece riempita di 1. Sono matrici identità:
${\begin{bmatrix}1&0\\0&1\end{bmatrix}}{\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix}}{\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix}}$
Per qualsiasi matrice identità I vale: $AI=A$ e $IA=A$

### Matrice trasposta

La trasposta di una data matrice è una seconda matrice dove sono invertite colonne e righe:
$A={\begin{bmatrix}A_{1,1}&A_{1,2}&A_{1,3}\\A_{2,1}&A_{2,2}&A_{2,3}\end{bmatrix}}A_{T}={\begin{bmatrix}A_{1,1}&A_{2,1}\\A_{1,2}&A_{2,2}\\A_{1,3}&A_{2,3}\end{bmatrix}}$

### Matrice inversa

Si definisce matrice inversa di una matrice M, una matrice M$^{-1}$ tale che $MM^{-1}=I$. Il calcolo della matrice inversa non è semplice e per quanto ci serve nemmeno utile. Esiste comunque una funzione di D3DX che ci permette di calcolare la matrice inversa di una data matrice.

## DirectX e le Matrici =

Una matrice in DirectX si può definire come di tipo D3DXMATRIX. In DirectX tutte le matrici sono sempre quadrate di lato 4. In altre parole ogni D3DXMATRIX ha sempre 4 righe e 4 colonne. La classe D3DXMATRIX è molto completa e fornisce operatori di uguaglianza, somma sottrazione, moltiplicazione per costante e per altra matrice. Ci sono inoltre 4 funzioni che svolgono altri compiti:
* D3DXMatrixIdentity prende un puntatore a matrice come argomento e trasforma quella matrice nella matrice identità.
* D3DXMatrixTranspose genera la matrice trasposta di una data matrice M. Come primo parametro vuole il puntatore alla matrice dove verrà messo il risultato e come secondo, la matrice originale.
* D3DXMatrixInverse genera la matrice inversa di una data matrice M. Funziona come Transpose.
* D3DXVec4Transfor moltiplica un vettore per una matrice ottenendo un nuovo vettore. Come argomenti vuole il puntatore al vettore risultato, il vettore da moltiplicare e la matrice da moltiplicare.
Terminato il modulo sulle matrici non posso che suggerire di allenarsi su fogli di carta o scrivere piccoli programmi per fissare questi concetti fondamentali per la computer graphics.