Metodi furbi per il prodotto matriciale

DarthMarkson
Eccomi qui, appena iscritto e già a rompere le balle agli esperti di matematica :)

Il mio problema è questo: devo implementare su un PIC il prodotto tra una matrice (verosimilmente di dimensioni 110x110) e un vettore (anch'esso lungo 110).
Il metodo classico di risoluzione per le matrici \(\displaystyle \left(AB\right)_{i,j} = \sum_{k=1}^p A_{i,k} \cdot B_{k,j} \) non va bene in quanto andrebbe a sprecare troppe risorse.

Mi chiedevo quindi se esistono degli algoritmi o comunque dei metodi per fare questo calcolo in maniera più rapida senza perdere troppa precisione.

Per intenderci, non penso che Matlab usi questa formula quando gli dico di fare A*B, giusto? cosa usa?


Metto le mani avanti con i mod: Non ho postato nella sezione informatica perché non sto chiedendo l'implementazione (a quella ci penso io) ma il metodo matematico che ci sta dietro.

Grazie a tutti dell'attenzione :)

Risposte
vict85
Beh, Matlab usa una versione di quel tipo fortemente ottimizzata, parallelizzata e cache-friendly ed eventualmente su gpu ma non la chiamerei una formula diversa.

dissonance
La sezione adatta in realtà è quella di Analisi Numerica, chiedo di spostare lì. Comunque, se la tua matrice non ha struttura particolare, mi sa che il prodotto matrice-vettore te lo devi bere così, non c'è molto da ottimizzare.

vict85
Premetto comunque che il vedere il prodotto nella forma da te scritta è decisamente poco utile. Il meglio è astrarlo in forma vettoriale o, in termini informatici, analizzare il problema in termini di cicli i,j. A seconda di come è memorizzata la matrice esistono metodi diversi per scrivere la stessa cosa.

DarthMarkson
Grazie a tutti per le risposte, a questo punto userò i classici cicli for e sono a posto

@vict85: la formula l'ho scritta perché alla fine, quando usi i 3 for nidificati, non fai altro che implementare quella :D

apatriarca
Una domanda probabilmente importante e che non è stata fatta è: come sono fatti la matrice e il vettore? Se la matrice avesse ad esempio molti zeri oppure se avesse una struttura particolare, si potrebbe forse fare qualcosa per ottimizzare il tuo codice.

vict85
"DarthMarkson":
Grazie a tutti per le risposte, a questo punto userò i classici cicli for e sono a posto

@vict85: la formula l'ho scritta perché alla fine, quando usi i 3 for nidificati, non fai altro che implementare quella :D


:roll: su un pic forse ma su altri hardware non è affatto detto che scrivere i tre for nidificati sia il massimo dell'efficienza. Scriverlo a blocchi può portare vantaggi per esempio.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.