Transponieren und Multiplizieren von Matrizen

ch275

Grünschnabel
Hallo zusammen.

Ich soll eine Funktion schreiben, die zu einer gegebenen Matrix die Transponierte bestimmt. Für die Transponierte soll dynamisch Speicher reserviert werden und der Zeiger auf diesen von der Funktion zurückgegeben werden. Die zweite Funktion soll zwei Matrizen(mxn und nxp) multiplizieren. Für die Produktmatrix soll in der Funktion wieder dynamisch Speicher reserviert werden und der Zeiger darauf zurückgegeben werden.

Dann soll alles im Hauptprogramm getestet werden. Es wird mir kein Fehler angezeigt, aber nach dem Einlesen der Matrizen passiert nichts mehr. Die Funktionen allocateMatrix, freematrix, readMatrix und printMatrix habe ich in der Übung entwickelt und sie funktionierten. Diese Funktionen sollten auch weiter verwendet werden.

Wäre für Hilfe sehr dankbar!


C++:
#include <stdio.h>
#include <stdlib.h>

float** allocateMatrix(int m, int n){ //Speicherplatz reservieren
	int i;
	float **matrix=(float**)calloc(m,sizeof(float*));
	for(i=0; i<m; i++){
		matrix[i]=(float*)calloc(n, sizeof(float));
	}
	return matrix;
}

void freeMatrix(float **matrix, int m){ //Speicherplatz freigeben
	int i;
	for(i=0; i<m; i++){
		free(matrix[i]);
	}
	free(matrix);
}

void readMatrix(float **matrix, int m, int n){ //Matrix eingeben
	int i;
	int j;

	for(i=0; i<m; i++){
		for(j=0; j<n;j++){
			printf("Element a[%d][%d]: \n", i+1,j+1); //Eingabe des Elementes a an der Stelle i,j
			scanf("%f", &matrix[i][j]);
		}
	}
}

void printMatrix(float **matrix, int m, int n){ //Matrix ausgeben
	int i;
	int j;
	
	for(i=0; i<m; i++){  //Schleife durch die Zeilen
		for(j=0; j<n; j++){ //Schleife durch die Spalten
			printf("%.2f\t", matrix[i][j]);
		}
		printf("\n");
	}
}

float** transposeMatrix(float **matrix, int m, int n){
	int i;
	int j;
	float**matrixT;
	
	matrixT=allocateMatrix(n, m); //Speicherplatzreservierung für die transponierte Matrix
	
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			matrixT[j][i]=matrix[i][j]; //Transponieren, Zeilenvektoren als Spaltenvektoren
		}
	}
	return matrixT;
}

float** multiplyMatrices(float **matrix, int m, int n, float **matrix2, int o, int p){
	int i;
	int j;
	int k;
	float** matrixM;
	
	if(n!=o){ //Fehler abfangen
		printf("Matrizen können nicht multipliziert werden, Spaltenzahl von A stimmt nicht mit Zeilenzahl von B überein.\n");
		return 0;
	}
	else{
		matrixM=allocateMatrix(m, p);
		for(i=0; i<m; i++){                  //Multiplikation von zwei Matrizen
			for(j=0; j<p; j++){
				matrixM[i][j]=0;
				for(k=0; k<n; k++){
					matrixM[i][j]=matrixM[i][j]+((matrix[i][k])*(matrix2[k][j]));
				}
			}
		}
		return matrixM; 
	}
}



int main(){
	float** M;
	float** N;
	float** T;
	float** P;
	int x=0;

	while(x!=1 && x!=2){
		printf("Was wollen Sie tun? (1) Matrix tranponieren (2) Zwei Matrizen multiplizieren\n"); //Benutzer einscheidet, was er tun möchte
		scanf("%d", &x);
	}

	if(x==1){
		M=allocateMatrix(2, 3); //Speicherplatz für M
		printf("Bitte M eingeben:\n");
		readMatrix(M, 2, 3); //Einlesen von M

		T=transposeMatrix(M, 2, 3);  //Transponieren von M

		printf("M:\n");
		printMatrix(M, 2, 3);
		printf("T:\n");
		printMatrix(T, 3, 2);
			
		freeMatrix(T, 3);
		freeMatrix(M, 2);
	}

	else if(x==2){

		M=allocateMatrix(2, 3); //Speicherplatz für M
		N=allocateMatrix(3, 5); //Speicherplatz für N

		printf("Bitte erste Matrix eingeben:\n");
		readMatrix(M, 2, 3); //Einlesen von M
		printf("Bitte zweite Matrix eingeben:\n");
		readMatrix(N, 3, 5); //Einlesen von N

		P=multiplyMatrices(M, 2, 3, N, 3, 5);

		printf("M:\n");
		printMatrix(M, 2, 3);
		printf("N:\n");
		printMatrix(N, 3, 5);
		printf("P: \n");
		printMatrix(P, 2, 5);

		freeMatrix(P, 2);
		freeMatrix(N, 3);
		freeMatrix(M, 2);
	}

	return 0;
}
 
Zuletzt bearbeitet:
Hi.

Die Code-Tags schließt man mit einem Slash: [/code]

Du hast eine Endlosschleife programmiert:
C++:
for (j= 0; j < n; j = 0 /* j bleibt immer 0 */) {
Beim Transponieren wird übrigens aus einer 3x2 Matrix eine 2x3 Matrix.

Gruß
 
Das mit dem j war wohl ein Tippfehler. Habe es mir so oft angesehen und trotzdem überlesen. Danke:-)

Allerdings funktioniert es immer noch nicht richtig. Es werden leider immer nur Nullen ausgegeben. Sogar für die selbst eingegebene Matrix M, nur N erscheint mit den eingegebenen Werten. Dabei hatte das Ein- und Ausgeben von M und N funktioniert, bevor ich die Funktionen transposeMatrix und multiplyMatrices hinzugefügt hatte.
 
Allerdings funktioniert es immer noch nicht richtig. Es werden leider immer nur Nullen ausgegeben. Sogar für die selbst eingegebene Matrix M, nur N erscheint mit den eingegebenen Werten. Dabei hatte das Ein- und Ausgeben von M und N funktioniert, bevor ich die Funktionen transposeMatrix und multiplyMatrices hinzugefügt hatte.
Du solltest dir nochmal ganz genau anschauen welche Matrix du in der transpose Funktion änderst.

Gruß
 
Habe ich schon gesehen. Und im Code oben schon geändert. Ich hatte auch j beim Multiplizieren falsch begrenzt.
 
Du hättest den Code nicht entfernen müssen, weil das Problem gelöst ist, vielleicht ist ja später mal jemand froh eine Implementation zu finden, die zeigt wie eine Matrix transponiert werden kann ;)
 
Moin,

Du hättest den Code nicht entfernen müssen, weil das Problem gelöst ist, vielleicht ist ja später mal jemand froh eine Implementation zu finden, die zeigt wie eine Matrix transponiert werden kann ;)

genau :-) oder noch besser:
poste (auch eben diesem Grund) doch Deinen kompletten korrekten Code ...

gruß
Klaus
 
Das weiß ich. Ich werde ihn auch wieder rein stellen. Aber erst morgen nach Abgabeschluss. Ich weiß, dass viele meiner Kommilitonen sich immer Lösungen im Internet suchen (und auch gerade hier) ohne sich selbst Gedanken zu machen und ich will nicht, dass alle meine Lösung abgeben. Ich finde es blöd, sich nicht selbst eine Lösung zu überlegen. Wenns dann nicht ganz hinhaut, kann man ja immer noch nachfragen. Aber von Anfang abzuschreiben ist dämlich.
 
Zurück