vermenigvuldigen matrices

Status
Niet open voor verdere reacties.

kilon666

Gebruiker
Lid geworden
19 dec 2009
Berichten
19
Ik zit met een paar problemen die ik niet kan verklaren.

Ik moet, indien mogelijk, twee matrices met elkaar vermenigvuldigen. Hiervoor moet ik 3 functies gebruiken.

Maar wat is er fout? Waarom doet hij het niet?

Mijn code:
Code:
#include <iostream>

using namespace std;

//Definieren van de grootte van de matrices	  VERPLICHT
#define MAX_SIZE 10

typedef float matrix[MAX_SIZE][MAX_SIZE];	 //VERPLICHT

//Functie prototypes
void lees_matrix(matrix a[MAX_SIZE][MAX_SIZE], int m, int n);
void vermenigvuldig(matrix a[MAX_SIZE][MAX_SIZE],matrix b[MAX_SIZE][MAX_SIZE],matrix c[MAX_SIZE][MAX_SIZE], int m, int n, int p);
void print_matrix(matrix c[MAX_SIZE][MAX_SIZE], int m,int p);

int main()
{
	matrix a, b, c;
	int rij_a, kolom_a, rij_b, kolom_b;
	int z(0);
	
	cout << "Voer het aantal rijen en kolommen voer matrix a in." << endl;	 //Dimensies matrix a aanduiden
	cin >> rij_a >> kolom_a;
	
	cout << "Voer het aantal rijen en kolommen voer matrix a in." << endl;	 //Dimensies matrix b aanduiden
	cin >> rij_b >> kolom_b;
	
	
	if(rij_b != kolom_a)		//Voorwaarde voor het vermenigvuldigen van de matrices
	{	
		cout << "De dimensies van de matrices zijn niet geschikt voor vermenigvuldiging" << endl;
		exit(1);
	}
	
	cout << "Matrix a:" << endl;			  //Matrix a tonen
	cout << lees_matrix(a, rij_a, kolom_a) << endl;
	
	cout << "Matrix b:" << endl;			  //Matrix b tonen
	cout <<lees_matrix(b, rij_b, kolom_b) << endl;
 
	vermenigvuldig(a, b, c, rij_a, kolom_a, kolom_b);			  //Uitvoeren van de vermenigvuldiging
	
	cout << "Het product van deze matrices is: " << endl;		  //Het product matrix c tonen
	cout << print_matrix << endl;
	
	 
	system("PAUSE");
	return 0;	   //Einde hoofdprogramma
}

/*------------------------------------------------------------*/
//Function lezen matrix
void lees_matrix(matrix a[MAX_SIZE][MAX_SIZE], int m, int n,int z)
{
	int rij, kolom;
	for (rij=0; rij<m; rij++)
	{
		cout << "Voer de data in voor rij "<< rij+1 << endl;
		for(kolom=0; kolom<n; kolom++)
		{
			cin >> a[rij][kolom];
		}
	z=z+1;
	}
	for(rij=0; rij<m; rij++)
	{
		for(kolom=0; kolom<n; kolom++)
		{
			cout << a[rij][kolom] << " " << endl;
			cout << " " << endl;
		}
	}
	
	return;
}


/*------------------------------------------------------------*/
//Functie voor het vermenigvuldigen van de matrix
void vermenigvuldig(matrix a[MAX_SIZE][MAX_SIZE],matrix b[MAX_SIZE][MAX_SIZE],matrix c[MAX_SIZE][MAX_SIZE], int m, int n, int p)
{
	//Declacratie
	int i, j, k;
		
	for(i=0; i<m; i++)
	{
		for(j=0; j<p; j++)
		{
			c[i][j]=0;
			for(k=0; k<n; k++)				
			{
				c[i][j] += a[i][k]*b[k][j];
			}
		}
	}
	return;
}


/*------------------------------------------------------------*/
//Functie voor het printen van een matrix
void print_matrix(matrix c[MAX_SIZE][MAX_SIZE], int m,int p)
{
	int rij, kolom;
	for(rij=0; rij<m; rij++)
	{
		for(kolom=0; kolom<m; kolom++)
		{
			cout << c[rij][kolom] << " ";
		}
	}
	return;  
}
 
Wat is precies het probleem? Als ik het probeer compileert hij niet. Is dat het probleem?

Het aantal argumenten van een prototype klopt niet met de functie
[cpp]void lees_matrix(matrix a[MAX_SIZE][MAX_SIZE], int m, int n);[/cpp] (3 argumenten)
[cpp]void lees_matrix(matrix a[MAX_SIZE][MAX_SIZE], int m, int n,int z)
{[/cpp] (4 argumenten)

Verder heb je "matrix" "getypedeft" als float[][]. Daarom mag je bij alle functies "[MAX_SIZE][MAX_SIZE]" weglaten. Dus [cpp]void print_matrix(matrix c[MAX_SIZE][MAX_SIZE], int m,int p)[/cpp] wordt [cpp]void print_matrix(matrix c, int m,int p)[/cpp] Dit moet je voor alle functies doen.

Verder kloppen [cpp]cout << lees_matrix(a, rij_a, kolom_a) << endl;[/cpp] [cpp]cout <<lees_matrix(b, rij_b, kolom_b) << endl;[/cpp] en [cpp]cout << print_matrix << endl;[/cpp] niet. Hier probeer je het resultaat van een void functie (een functie die niets oplevert) te printen. Als een functie niets oplevert kan je het resultaat daarvan niet printen. Dit moet dus [cpp]lees_matrix(a, rij_a, kolom_a);[/cpp] [cpp]lees_matrix(b, rij_b, kolom_b);[/cpp] en [cpp]print_matrix[/cpp] worden. Bij die laatste moet je bovendien nog de juiste argumenten meegeven.
 
Laatst bewerkt:
De fout zit hem ergens in het inlezen van de matrix.

Ik kan gewoon de data invoeren, maar daarna zijn er honderden rare getallen

[CPP]/*------------------------------------------------------------*/
//Function lezen matrix
void lees_matrix(matrix a, int m, int n)
{
int rij, kolom;
for (rij=0; rij<m; rij++)
{
cout << "Voer de data in voor rij "<< rij+1 << endl;
for(kolom=0; kolom<n; kolom++)
{
cin >> a[rij][kolom];
}
//z=z+1;
}
// for(rij=0; rij<m; rij++)
// {
// for(kolom=0; kolom<n; kolom++)
// {
// cout << a[rij][kolom] << " " << endl;
// cout << " " << endl;
// }
// }

return;
}[/CPP]
 
De fout zit hem ergens in het inlezen van de matrix.

De code voor het inlezen van de matrix klopt anders wel gewoon.

Ik kan gewoon de data invoeren, maar daarna zijn er honderden rare getallen

Print je wellicht ongeinitialiseerde variabelen? (dit gebeurt bijvoorbeeld wanneer je data aanspreekt vanaf matrix[m][n], aangezien die niet geinitialiseerd zijn)

Een andere mogelijkheid is dat je een ongeldige waarde als invoer gebruikt waardoor de stream corrupt raakt (een string bijvoorbeeld). Als je de stream in zo'n geval niet herstelt zal je ook allemaal vreemde getallen als output krijgen. Om de stream automatisch te herstellen zou je iets als het onderstaande kunnen doen:

[cpp]
while(!(cin >> a[rij][kolom]))
{
cin.clear();
cin.ignore(INT_MAX, '\n');
}
[/cpp]
 
Mijn main-programma ziet er zo uit
[CPP]#include <iostream>

using namespace std;

//Definieren van de grootte van de matrices
#define MAX_SIZE 10

typedef float matrix[MAX_SIZE][MAX_SIZE]; //VERPLICHT

//Functie prototypes
void lees_matrix(matrix a, int m, int n);
void vermenigvuldig(matrix a,matrix b,matrix c, int m, int n, int p);
void print_matrix(matrix c, int m,int p);

int main()
{
matrix a, b, c;
int rij_a, kolom_a, rij_b, kolom_b;
//int z(0);
int m, p;

cout << "Voer het aantal rijen en kolommen voer matrix a in." << endl; //Dimensies matrix a aanduiden
cin >> rij_a >> kolom_a;

cout << "Voer het aantal rijen en kolommen voer matrix b in." << endl; //Dimensies matrix b aanduiden
cin >> rij_b >> kolom_b;


if(rij_b != kolom_a) //Voorwaarde voor het vermenigvuldigen van de matrices
{
cout << "De dimensies van de matrices zijn niet geschikt voor vermenigvuldiging" << endl;
exit(1);
}

cout << "Matrix a:" << endl; //Matrix a tonen
lees_matrix(a, rij_a, kolom_a);

cout << "Matrix b:" << endl; //Matrix b tonen
lees_matrix(b, rij_b, kolom_b);

vermenigvuldig(a, b, c, rij_a, kolom_a, kolom_b); //Uitvoeren van de vermenigvuldiging

cout << "Het product van deze matrices is: " << endl; //Het product matrix c tonen
print_matrix(c, m, p);


system("PAUSE");
return 0; //Einde hoofdprogramma
}[/CPP]

waarbij het in regel 36 (en 39) dus fout gaat.

En ik weet ook niet of het vervolg wel goed gaat nu.

Voor de functies, zie de OP.
 
Volgens mij zit het probleem in [cpp]print_matrix(c, m, p);[/cpp] (regel 44). 'm' en 'p' hebben geen waarde. Als ik het verander in [cpp]print_matrix(c, rij_a, kolom_b);[/cpp] (ik weet niet of dat goed is, maar ik heb deze namen overgenomen van de vermenigvuldig functie) en twee matrices van 2x2 laat vermenigvuldigen (matrix 1 (1,2),(3,4); matrix 2 (5,6),(7,8)) krijg ik wel een normale uitkomst:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan