Prodotto di Matrici in c++
Salve a tutti, ho delle difficoltá a risolvere questo problema assegnato:
• Scrivere un programma C++ che legge da tastiera
(e da file) una matrice m di dimensioni N*M
• calcola la matrice trasposta di m, mT
• calcola la matrice prodotto m* mT
Per una buona organizzazione del codice vanno definiti e usati i seguenti sottoprogrammi
• void calcolaTrasposta(int m[N][M], int t[M][N]);
• void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]);
Fino alla parte della trasposta nessun problema (poi ovviamente se avete qualche consiglio anche riguardo a questo punto, lo accetto volentieri). La difficoltá inizia (ovviamente) sul prodotto delle due. Vi posto il codice che ho creato fin'ora. Praticamente mi si generano dei valori a caso della matrice prodotto, spero possiate aiutarmi, grazie in anticipo.
• Scrivere un programma C++ che legge da tastiera
(e da file) una matrice m di dimensioni N*M
• calcola la matrice trasposta di m, mT
• calcola la matrice prodotto m* mT
Per una buona organizzazione del codice vanno definiti e usati i seguenti sottoprogrammi
• void calcolaTrasposta(int m[N][M], int t[M][N]);
• void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]);
Fino alla parte della trasposta nessun problema (poi ovviamente se avete qualche consiglio anche riguardo a questo punto, lo accetto volentieri). La difficoltá inizia (ovviamente) sul prodotto delle due. Vi posto il codice che ho creato fin'ora. Praticamente mi si generano dei valori a caso della matrice prodotto, spero possiate aiutarmi, grazie in anticipo.
#include <iostream> using namespace std; const int N=2, M=3; void leggiMatrice(int matrice[N][M]); void stampaMatrice(int matrice[N][M]); void calcolaTrasposta(int m[N][M], int t[M][N]); void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]); int main(){ int matrice[N][M], trasposta[M][N], prodotto[N][N]; leggiMatrice(matrice); stampaMatrice(matrice); calcolaTrasposta(matrice,trasposta); calcolaProdotto(matrice,trasposta,prodotto); system("PAUSE"); } void leggiMatrice(int matrice[N][M]){ cout << "inserisci la matrice " << N << " x " << M << ": " <<endl; for (int i=0; i<N; i++) for(int j=0; j<M; j++) cin >> matrice[i][j]; return; } void stampaMatrice(int matrice[N][M]){ cout << "La matrice immessa e': " <<endl; for (int i=0; i<N; i++){ for(int j=0; j<M; j++){ cout << matrice[i][j] << "\t"; } cout <<endl; } return; } void calcolaTrasposta(int m[N][M], int t[M][N]){ cout << "La matrice trasposta e': " <<endl; int temp; for (int i=0; i<N; i++){ for(int j=0; j<M; j++){ temp=m[i][j]; m[i][j]=t[j][i]; t[j][i]=temp; } } for(int i=0; i<M; i++){ for(int j=0; j<N; j++){ cout << t[i][j] << "\t"; } cout <<endl; } return; } void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]){ int k; for(int i=0; i<N; i++){ for(int j=0; j<M; j++){ prodotto[i][j] = 0; for(k=0; k<N; k++){ prodotto[i][j] += m1[i][k] * m2[k][j]; } } } cout << "La matrice prodotto delle due e': " <<endl; for (int i=0; i<k; i++){ for(int j=0; j<k; j++){ cout << prodotto[i][j] << "\t"; } cout <<endl; } return; }
Risposte
Questo dovrebbe andare
Prendi tutto con le pinze perché io non ho mai fatto una riga di C++, ma conosco il C ed in questo caso le cose funzionano alla stessa maniera credo
Il problema che ho notato facendo il debug era nella funzione della trasposta dalla quale ho eliminato quest'assegnazione:
m[j]=t[j];
che ti generava una matrice con numeri casuali al posto della prima che avevi inserito..
Poi ho riscritto la funzione prodotto per scrupolo, visto che credevi di riscontrare li gli errori ma non ho provato la tua

Prendi tutto con le pinze perché io non ho mai fatto una riga di C++, ma conosco il C ed in questo caso le cose funzionano alla stessa maniera credo

Il problema che ho notato facendo il debug era nella funzione della trasposta dalla quale ho eliminato quest'assegnazione:
m[j]=t[j];
che ti generava una matrice con numeri casuali al posto della prima che avevi inserito..
Poi ho riscritto la funzione prodotto per scrupolo, visto che credevi di riscontrare li gli errori ma non ho provato la tua

#include <iostream> using namespace std; const int N=2, M=3; void leggiMatrice(int matrice[N][M]); void stampaMatrice(int matrice[N][M]); void calcolaTrasposta(int m[N][M], int t[M][N]); void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]); int main(){ int matrice[N][M], trasposta[M][N], prodotto[N][N]; leggiMatrice(matrice); stampaMatrice(matrice); calcolaTrasposta(matrice,trasposta); calcolaProdotto(matrice,trasposta,prodotto); } void leggiMatrice(int matrice[N][M]){ cout << "inserisci la matrice " << N << " x " << M << ": " <<endl; for (int i=0; i<N; i++) for(int j=0; j<M; j++) cin >> matrice[i][j]; return; } void stampaMatrice(int matrice[N][M]){ cout << "La matrice immessa e': " <<endl; for (int i=0; i<N; i++){ for(int j=0; j<M; j++){ cout << matrice[i][j] << "\t"; } cout <<endl; } return; } void calcolaTrasposta(int m[N][M], int t[M][N]){ cout << "La matrice trasposta e': " <<endl; int temp; for (int i=0; i<N; i++){ for(int j=0; j<M; j++){ temp=m[i][j]; t[j][i]=temp; } } for(int i=0; i<M; i++){ for(int j=0; j<N; j++){ cout << t[i][j] << "\t"; } cout <<endl; } return; } void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]){ int i,j,r; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { prodotto[i][j] = 0; for (r = 0; r < M; r++) { prodotto[i][j] += m1[i][r] * m2[r][j]; } } } cout << "La matrice prodotto delle due e': " <<endl; for(int l = 0; l < N; l++) { for(int e = 0; e < N; e++) { cout << prodotto[l][e] <<"\t"; } cout << '\n'; // o cout << end; } return; }
cout << "La matrice prodotto delle due e': " <<endl; for (int i=0; i<k; i++){ for(int j=0; j<k; j++){ cout << prodotto[i][j] << "\t"; } cout <<endl; }
Ho dato una occhiata veloce al tuo codice per il prodotto e il problema potrebbe essere legato alla stampa della matrice piuttosto che prodotto vero e proprio. Sei infatti certo che k sia uguale ad N? C'è poi un motivo per cui utilizzi k invece di N? Non avendo testato il tuo codice non posso dire se è effettivamente un problema, però usare N è più corretto e più error-proof.
Ecco ragazzi, allora il professore mi ha risposto alla mail, correggendomi il codice in questo modo.
grazie comunque a tutti e due ragazzi delle risposte. Se avete qualche suggerimento in piú o qualche spiegazione, le accolgo volentieri.
#include <iostream> using namespace std; const int N=2, M=3; void leggiMatrice(int matrice[N][M]); void stampaMatrice(int matrice[N][M]); void calcolaTrasposta(int m[N][M], int t[M][N]); void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]); int main(){ int matrice[N][M], trasposta[M][N], prodotto[N][N]; leggiMatrice(matrice); stampaMatrice(matrice); calcolaTrasposta(matrice,trasposta); calcolaProdotto(matrice,trasposta,prodotto); system("PAUSE"); } void leggiMatrice(int matrice[N][M]){ cout << "inserisci la matrice " << N << " x " << M << ": " <<endl; for (int i=0; i<N; i++) for(int j=0; j<M; j++) cin >> matrice[i][j]; return; } void stampaMatrice(int matrice[N][M]){ cout << "La matrice immessa e': " <<endl; for (int i=0; i<N; i++){ for(int j=0; j<M; j++){ cout << matrice[i][j] << "\t"; } cout <<endl; } return; } void calcolaTrasposta(int m[N][M], int t[M][N]){ cout << "La matrice trasposta e': " <<endl; int temp; for (int i=0; i<N; i++){ for(int j=0; j<M; j++){ t[j][i]=m[i][j]; //non avevo bisogno di "bloccare" la variabile col temp } } for(int i=0; i<M; i++){ for(int j=0; j<N; j++){ cout << t[i][j] << "\t"; } cout <<endl; } return; } void calcolaProdotto(int m1[N][M],int m2[M][N], int prodotto[N][N]){ int k; for(int i=0; i<N; i++){ for(int j=0; j<N; j++){ // il problema era qui.Iinizialmente avevamo j<M, ma la matrice che si viene a formare é NxN, per cui andava sostituito con j<N. prodotto[i][j] = 0; for(k=0; k<M; k++){ // infine qui, k<M al posto di k<N... ma non ho ben capito. prodotto[i][j] += m1[i][k] * m2[k][j]; } } } cout << "La matrice prodotto delle due e': " <<endl; for (int i=0; i<N; i++){ for(int j=0; j<N; j++){ cout << prodotto[i][j] << "\t"; } cout <<endl; } return; }
grazie comunque a tutti e due ragazzi delle risposte. Se avete qualche suggerimento in piú o qualche spiegazione, le accolgo volentieri.