PDA

Visualizza la versione completa : Prodotto tra matrici in C++.


emami
30-01-2008, 21:49
Ciao ragazzi,
sono abbastanza preoccupato per l'esame che avrò tra 10 giorni, spero mi possiate dare una mano.
Trattasi al momento di un problema che rigurda il prodotto di due matrici. M e L
Sembrerebbe che il codice sia scritto bene, tanto è vero che riesco a compilarlo, ma quanto effettuo il Run, mi da subito l'errore.
il codice del ciclo for che dovrebbe fare l'operazione è:

for(i=1; i<=k ;i++)
{
for(j=1; j<=k ;j++)
{
N[i][j]=0;
for(h=1; h<=k ;h++)
{
N[i][j]+=M[i][h]*L[h][k];
}
}
}

L'unica cosa che vi posso dire è che tutte e tre le matrci sono definite come puntatori di puntatori, e vanno a richiamarsi la funzione Matrice, dove appunto viene allocata la memoria dinamicamente in funzione della dimensione di riga e colonna.
Successivamente le matrici M e L ottengono i loro valori da tastiera.
Il codice completo è:

Sapreste dirmi quale è il problema?

Grazie
Amartya
PS.
Il mio fine ultimo è calcolarmi una successione di vettori per n=2,3,4......300

emami
30-01-2008, 21:52
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>

using namespace std;
double** Matrice(int r,int c);/*funzione che crea dinamicamente una matrice di r righe e c colonne*/
void leggimat(int r, int c, double** M );

double Prodotto(double, double, int, int, int);
main()
{int i,k,n,j,h,y; double x;

cout<<"\n dammi il numero reale x = ";
cin>> x;
cout<<"\n dammi il numero dei componenti del vettore k = ";
cin>> k;
if (k>40) return 0;
double** L; /* variabile puntatore */
double** M; /* variabile puntatore */
double** N; /* variabile puntatore */
M = Matrice(k,k);
L = Matrice(k,k);
leggimat(k,k,M);
leggimat(k,k,L);

N = Matrice(k,k);

for(i=1; i<=k ;i++)
{
for(j=1; j<=k ;j++)
{
N[i][j]=0;
for(h=1; h<=k ;h++)
{
N[i][j]+=M[i][h]*L[h][k];
}
}
}





cout<<"\n Matrice N = ";

for(i=0; i<k ;i++)
{
for(j=0; j<k ;j++)
{
cout << "\n l'elemento di riga "<< i << " e di colonna " << j << ": "<< N[i][j];
N[i][j];
}
}






system("\n PAUSE");return 0;

}



double** Matrice(int r, int c )
{
double** m;
int i,j;
m=new double* [r];
/* ora posso creare le righe */
for (i=0;i<r;i++)
m[i] = new double[c];
return m;
}
void leggimat(int r, int c, double** M )
{
int i,j;
for ( i = 0; i <r; i++)
for (j = 0; j <c; j++){
cout << "\n Inserire l'elemento di riga "<< i
<< " e di colonna " << j << ": ";
cin >> M[i][j];
}
}

shodan
30-01-2008, 22:11
Questo ciclo (e i suoi simili) sono sbagliati.
Un array V[n] parte sempre da 0 e finisce a n-1, non da 1 a n


for(i=1; i<=k ;i++)

Corretto è:



for(i=0; i<k ;i++)

emami
30-01-2008, 22:22
Problema risolto
Si trattava del punto di partenza del ciclo for, settato su 1, anzichè su 0, quindi non c'era un matching tra le matrici.

Grazie lo stesso.

Mi riservo di chiedervi qualcos'altro sul calcolo di una successione di matrici.
Anzi se avete qualcosa, vi sarei grato se potreste postarmelo.

Amartya

pallinopinco
30-01-2008, 22:53
Problema risolto
Si trattava del punto di partenza del ciclo for, settato su 1, anzichè su 0, quindi non c'era un matching tra le matrici.

Grazie lo stesso.

Esattamente come ti ha indicato Shodan, o sbaglio? :stordita:

emami
31-01-2008, 16:20
Si infatti, ma giuro che non l'avevo visto.

Cmq grazie per la tempestività e per la correttezza dell'informazione

Amartya

Loading