View Full Version : [C++] Moltiplicazione di una matrice per un vettore riga
DomusP45
17-12-2013, 12:00
Salve a tutti, nonostante abbia cercato su internet la cosa ed implementato il codice, mi escono fuori cose strane, quindi vi chiedo aiuto in merito a questa questione.
Devo ottenere un vettore riga 4x1 dalla moltiplicazione di una matrice 4x4 ed un vettore riga 4x1
Vedendolo a livello di matrici e vettori (trasposti) la situazione da ottenere e questa: nel vettore PC, metto il risultato di TC per P1.
|Pc(0) | | 1.0 0.0 0.0 0.0 | | P1(0) |
|Pc(1) | | 0.0 -1.0 0.0 0.0 | | P1(1) |
|Pc(2) | = | 0.0 0.0 -1.0 0.45 | * | P1(2) |
|Pc(3) | | 0.0 0.0 0.0 1.0 | | P1(3) |
io l'ho implementata così:
double P1[4] = {P.x,P.y,P.z,1.0};
double Pc[4] = {0.0, 0.0, 0.0, 0.0};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Pc[i] = Pc[i]+TC[i][j]*P1[j];
}
}
ma ho dei dubbi sulla corretta esecuzione di quell'operazione. E' corretta secondo voi?
Oceans11
17-12-2013, 12:11
Salve a tutti, nonostante abbia cercato su internet la cosa ed implementato il codice, mi escono fuori cose strane, quindi vi chiedo aiuto in merito a questa questione.
Devo ottenere un vettore riga 4x1 dalla moltiplicazione di una matrice 4x4 ed un vettore riga 4x1
Vedendolo a livello di matrici e vettori (trasposti) la situazione da ottenere e questa: nel vettore PC, metto il risultato di TC per P1.
|Pc(0) | | 1.0 0.0 0.0 0.0 | | P1(0) |
|Pc(1) | | 0.0 -1.0 0.0 0.0 | | P1(1) |
|Pc(2) | = | 0.0 0.0 -1.0 0.45 | * | P1(2) |
|Pc(3) | | 0.0 0.0 0.0 1.0 | | P1(3) |
io l'ho implementata così:
double P1[4] = {P.x,P.y,P.z,1.0};
double Pc[4] = {0.0, 0.0, 0.0, 0.0};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Pc[i] = Pc[i]+TC[i][j]*P1[j];
}
}
ma ho dei dubbi sulla corretta esecuzione di quell'operazione. E' corretta secondo voi?
No, la matrice la scorri per colonne.
Ad ogni modo, dovresti accorgertene facilmente da qualche test.
DomusP45
17-12-2013, 13:09
No, la matrice la scorri per colonne.
Ad ogni modo, dovresti accorgertene facilmente da qualche test.
quindi non va bene così? Devo modificare gli indici?
vendettaaaaa
17-12-2013, 13:35
E' giusta così.
DomusP45
17-12-2013, 13:38
E' giusta così.
Ok, allora se questa va bene, il problema starà da qualche altra parte...
vendettaaaaa
17-12-2013, 13:44
Io cmq faccio fatica a leggere codice scritto in modo così condensato, io userei più spazi (come si fa nel linguaggio naturale, ad esempio, dopo la punteggiatura):
double P1[4] = {P.x,P.y,P.z,1.0};
double Pc[4] = {0.0, 0.0, 0.0, 0.0};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
Pc[i] += TC[i][j] * P1[j];
}
}
Oceans11
17-12-2013, 15:59
E' giusta così.
ooopppssss :rolleyes:
:fagiano:
DomusP45
17-12-2013, 16:00
ooopppssss :rolleyes:
:fagiano:
Ragazzi mi fate capire allora? E' giusta o sbagliata? Se è sbagliata, come devo impostare la cosa per ottenere quello che ho scritto?
vendettaaaaa
17-12-2013, 16:02
ooopppssss :rolleyes:
:fagiano:
Se scrivi la risposta "giusta" anzichè usare smile supponenti fai risparmiare tempo a tutti.
Oceans11
17-12-2013, 16:10
calmi, calmi!
la risposta è giusta, ho sbagliato io.
vendettaaaaa
17-12-2013, 16:13
;)
DomusP45
17-12-2013, 16:14
Quindi vendettaa mi aveva confermato correttamente. Il prodotto di una matrice 4x4 per un vettore riga 1x4 si fa così...ok...
vendettaaaaa
17-12-2013, 16:24
Quindi vendettaa mi aveva confermato correttamente. Il prodotto di una matrice 4x4 per un vettore riga 1x4 si fa così...ok...
Scusa mi par di ricordare che tu sei laureato in Ing. Informatica al Politecnico di Milano... e hai ancora dubbi su come moltiplicare una matrice per un vettore?!
DomusP45
17-12-2013, 16:30
Scusa mi par di ricordare che tu sei laureato in Ing. Informatica al Politecnico di Milano... e hai ancora dubbi su come moltiplicare una matrice per un vettore?!
Sbagli...non sono laureato (non ancora) e non al politecnico di Milano, ed in ogni caso non ti capita mai di avere dubbi a volte su cose banali?
A me il dubbio di quest'implementazione lo da il fatto di cosa vado fisicamente a moltiplicare e per chi...la regola della moltiplicazione matrice/vettore la conosco, e che questa implementazione è adatta sia per un vettore colonna che per uno riga, solo che mi preoccupavano gli indici, quando vado a scorrere, se effettivamente moltiplico colonna per colonna della matrice per gli elementi del vettore P1, oppure lo sto facendo riga per riga con gli elementi del vettore P1...questa è la cosa che mi creava il dubbio...
vendettaaaaa
17-12-2013, 17:24
Sbagli...non sono laureato (non ancora) e non al politecnico di Milano, ed in ogni caso non ti capita mai di avere dubbi a volte su cose banali?
A me il dubbio di quest'implementazione lo da il fatto di cosa vado fisicamente a moltiplicare e per chi...la regola della moltiplicazione matrice/vettore la conosco, e che questa implementazione è adatta sia per un vettore colonna che per uno riga, solo che mi preoccupavano gli indici, quando vado a scorrere, se effettivamente moltiplico colonna per colonna della matrice per gli elementi del vettore P1, oppure lo sto facendo riga per riga con gli elementi del vettore P1...questa è la cosa che mi creava il dubbio...
Vabbè...a me pare palese che se la formula sta nel ciclo interno, prima scorre j da 0 a 3, quindi i primi 4 elementi della matrice che vengono letti sono quelli a i = 0 e j variabile, cioè quelli della riga 0-esima...quindi stai moltiplicando il vettore a destra con la matrice presa per righe.
DomusP45
17-12-2013, 17:28
Vabbè...a me pare palese che se la formula sta nel ciclo interno, prima scorre j da 0 a 3, quindi i primi 4 elementi della matrice che vengono letti sono quelli a i = 0 e j variabile, cioè quelli della riga 0-esima...quindi stai moltiplicando il vettore a destra con la matrice presa per righe.
Esatto, ma stranamente non mi escono le cose che dovrebbero...diciamo che bisognerebbe fare colonna della matrice per vettore...in tal caso l'operazione dovrebbe essere su i e non su j, giusto?
vendettaaaaa
17-12-2013, 17:38
Esatto, ma stranamente non mi escono le cose che dovrebbero...diciamo che bisognerebbe fare colonna della matrice per vettore...in tal caso l'operazione dovrebbe essere su i e non su j, giusto?
Basta cambiare Tc[i][j] in Tc[j][i]. Però questo vale finchè la matrice rimane quadrata e di dimensione pari a quella del vettore.
DomusP45
17-12-2013, 17:40
Basta cambiare Tc[i][j] in Tc[j][i]. Però questo vale finchè la matrice rimane quadrata e di dimensione pari a quella del vettore.
Certo, quella sarà sempre di quella dimensione ed anche il vettore...difatti facendo questo cambiamento, quello che esce assomiglia di più a quello che dovrebbe essere (come elementi del vettore risultato)...comincio a credere che sia solo quello il problema...
Grazie di essere stato così disponibile. ;)
Ti auguro una buona serata.
vendettaaaaa
17-12-2013, 18:23
Certo, quella sarà sempre di quella dimensione ed anche il vettore...difatti facendo questo cambiamento, quello che esce assomiglia di più a quello che dovrebbe essere (come elementi del vettore risultato)...comincio a credere che sia solo quello il problema...
Grazie di essere stato così disponibile. ;)
Ti auguro una buona serata.
Questo problema fa parte della conversione da matlab a C++? Probabilmente in MATLAB la matrice era trasposta o qualcosa di simile...mi ricordo che bisogna stare attenti a come sono memorizzati i vettori (di default sono in colonna?), quindi quello che pensi fosse un prodotto matrice x vettore nella forma che gli hai dato in C++ era in realtà qualche modo trasposto in MATLAB.
DomusP45
17-12-2013, 18:44
Questo problema fa parte della conversione da matlab a C++? Probabilmente in MATLAB la matrice era trasposta o qualcosa di simile...mi ricordo che bisogna stare attenti a come sono memorizzati i vettori (di default sono in colonna?), quindi quello che pensi fosse un prodotto matrice x vettore nella forma che gli hai dato in C++ era in realtà qualche modo trasposto in MATLAB.
molto probabile. Grazie ancora.
EDIT: E' andata bene. Grazie della disponibilità.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.