Matrix multiplikation --->net Help

janosch

Erfahrenes Mitglied
HI !

Ich habe eine Aufgabe bekommen bei der ich nicht weiß wie ich sie angehen soll und zwar diese:

Das Programm soll eine Matrixmultiplikation durchführen mit einer maximalen Dimension pro Matrix von 3x3.

Einlesen : ZeilenZ. SpaltenZ für A

Einlesen A

Einlesen : ZeilenZ. SpaltenZ für B

Einlesen B

Ausgabe der Ergebnis Matrix C


zja bei dieser aufgabe stehe ich vollkommen auf dem schlauch habt ihr vieleicht ein paar tips wie ihr die aufgabe angehen würdet ?

P.S. ein paar C Code schnipsel wären nicht schlecht !!

mfg janosch
 
Hallo,

also mal von anfang an...

Du hast zwei Matrizen die mit du miteinander multiplizieren sollst, in der art...

Was gilt es zu Beachten?
Der erste Faktor muss genau so viele Spalten besitzen, wie der zweite Faktor Zeilen. Eine 2x3-Matrix kann man mit einer 3x3-Matrix multiplizieren (das Ergebnis ist eine 2x3-Matrix), aber nicht umgekehrt


Beispiel:
Code:
A1 A2 A3     D1 D2 D3     X1 X2 X3
B1 B2 B3  x  E1 E2 E3  =  Y1 Y2 Y3
             F1 F2 F3
also wenden wir hier das Falkschema an:
Code:
          |  D1 D2 D3
          |  E1 E2 E3
          |  F1 F2 F3
----------|-----------
A1 A2 A3  |  X1 X2 X3
B1 B2 B3  |  Y1 Y2 Y3
----------------------
die A/B Matrix is gegeben, genauso die D/E/F Matrix. Gesucht wird die Ergebnissmatrix X/Y

Der Punkt X1 errechnet sich nun follgendermasen:
Code:
X1 = A1 x D1 + A2 x E1 + A3 x F1
X2 = A1 x D2 + A2 x E2 + A3 x F2
usw...
also immer die jeweilige Zeile mir der jeweilige Spalte und das ganze aufsummiert...

Achtung: Für die Multiplikation gilt im allgeimeinen kein Komulativgesetz!!!

Ok, soweit zur Theorie...


zu C:

Beispiel -> hab jetzt keine Zeit zum ausführlichen Code schreiben -> Armageddon anschauen ;-)...

Ich würde es aber (bei so kleinen Marizen) NICHT mit Pointern regeln... Ich würds aber zuerst selbst versuchen und erst dann den Link hernehmen - is nämlich einen schöne Fingerübung ;)


Ciao Andreas

PS: Bei Fragen einfach nochmal Posten...
 
@crono

THX schon mal da bin ich jetzt ein stück weiter

hi !

Soweit ist mir das klar .Das eigentlich problem liegt darin das ich für jede zeile und jede spalte die werte einlesen muß bei einer 3x3 matrix wären das z.B. 9 Eingabeaufforderungen. Wie muß ich diese werte einlesen und zwichenspeichern ohne feste größe sprich einer variablen Matrix mit einer maximalen dimesion von 3x3(die matrixgröße wurde zuvor vom user eingeben kann also auch eine 2x3 matrix sein)?


P.S. Ich hoffe ich habe mich verständlich ausgetrückt und das meine fragen nicht zu vielverlangt sind
mfg janosch


wenn die matrix einen festen wert hätte würde ich sie so inizialisieren nur das hat sie halt nicht die werte von 1 bis 9 sollen variabel sein sprich vom user eingegeben werden so wie die spalten zahl und die zeilen zahl:

PHP:
matrix [3] [3]={ 1,2,3,
                 4,5,6,
                 7,8,9};

oder so änlich

mfg janosch
 
Hallo,

also ich würde es ungefähr so angehen...

Code:
#include <stdio.h>
#include <math.h>
#define max 3

int main (void)
{
	int as; //spalten matrix a
	int az; //zeilen matrix a
	int bs; //spalten matrix b
	int bz; //zeilen matrix b
	int i=0;  //counter
	int j=0;	//counter
	double matrixa[max][max]; //erste Matrix
	double matrixb[max][max]; //zweite Matrix
	double matrixe[max][max]; //ergebnis Matrix

	printf("Gib die Dimensionen der Matrizen ein\n");
	// Hier kommt eine Erklärung rein wie die Matrizen belegt werden...
	scanf("%d",&as);
	scanf("%d",&az);
	scanf("%d",&bs);
	scanf("%d",&bz);

	// Hier kommt ein Block der Überprüft ob die Matrizen überhaupt 
	// multiplizierbar sind ... -> wenn ja weiter, ansonsten loop
	// bis es passt

	// Check
	printf("Ihr Matrizen haben das Format %i auf %i und %i auf %i \n", as, az, bs, bz);
	printf("\n\n\n Bitte belegen sie die erste Matrix mir %d Werten\n", as*az);


	// Jetzt die Matrizen belegen
	for (i = 0; i < as; i++)
	{	printf("Wert %d = ", i, i-1);
		for (j = 0; j < az; j++)
			scanf("%d", & matrixa[i][j]);
	}

	// and so on... and so on...

return 0;
}

-> habe leider keinen Compiler zur Hand, deshalb ohne Gewähr... Sollte aber schon irgendwie in der Richtung funktionieren ... Wenn du´s allerdings mit Zeigern machen würdest würden solche Probs gar nicht erst auftauchen...

bei max 3x3 würde ich fast überlegen es über switch und case zu machen ;)


cu Andreas
 
@crono

Danke erstmal für deine Hilfe !!

Ich habe das Programm jetzt sogut wie fertig aber ich bekomme das mit der eigentlichen berechnung nicht hin !

Hier ist mein Code den ich zur berechnung benutze:

PHP:
 	// Matrix berechnen

   for(f=0; f < az; f++)
     for(g = 0; g < bs; g++)
           matrixC[f][g] += matrixA[f][g] * matrixB[f][g];

	// Matrix C ausgeben
   
	for (f = 0; f < az; f++)
	{	printf("\n"); 
		for (g = 0; g < bs; g++)
			printf("%d ",matrixC[f][g]);
		
	}

Ich komme echt nicht drauf wo mein fehler liegt:mad: :mad: :mad:

Ach ja Matrizen werden korrekt eingelesen

P.S. Habe noch nicht so viel mit c gemacht bin also noch neuling in dem gebiet

mfg janosch
 
Zuletzt bearbeitet:
jepp hier ist er

PHP:
#include <stdio.h>
#include <math.h>
#define max 3

int main (void)
{
	int as=0;   //spalten matrix a
	int az=0;   //zeilen matrix a
	int bs=0;   //spalten matrix b
	int bz=0;   //zeilen matrix b
	int i=0;    //counter
	int j=0;	//counter
	int f=0;    //counter
	int g=0;    //counter
	double matrixA[max][max]; //erste Matrix
	double matrixB[max][max]; //zweite Matrix
	double matrixC[max][max]; //ergebnis Matrix

	while(1){

		printf("Gib die Dimensionen der Matrizen ein\n");
	    
	    printf("Wieviel Zeilen hat die Matrix A ?\n");

	    printf("Zeilen = ");

	    scanf("%d",&az);

	    printf("Wieviel Spalten hat die Matrix A ?\n");

	    printf("Spalten = ");

	    scanf("%d",&as);

	    printf("Wieviel Zeilen hat die Matrix B ?\n");

	    printf("Zeilen = ");

	    scanf("%d",&bz);

	    printf("Wieviel Spalten hat die Matrix B ?\n");

	    printf("Spalten = ");

	    scanf("%d",&bs);

	// Hier kommt ein Block der Überprüft ob die Matrizen überhaupt 
	// multiplizierbar sind ... -> wenn ja weiter, ansonsten loop
	// bis es passt

	
     if(as==bz)break;

		else printf("Die Matrizen lassen sich so nicht Multiplitzieren geben Sie neu Werte ein !!\n");
	}
	

	// Check
	printf("Ihre Matrix A hat das Format %i auf %i \n", as, az);
	printf("Ihre Matrix B hat das Format %i auf %i \n", bs, bz);
	printf("\n\n\nBitte belegen sie die Matrix A mit %d Werten\n", as*az);


	// Jetzt die Matrizen belegen
	for (i = 0; i < as; i++)
	{	printf("Zeile %d = ", i+1); 
		for (j = 0; j < az; j++)
			scanf("%d", & matrixA[i][j]);
	}

    // Matrize A zur kontrolle ausgeben
	for (i = 0; i < as; i++)
	{	printf("\n"); 
		for (j = 0; j < az; j++)
			printf("%d ",matrixA[i][j]);
		
	}

    printf("\n\n\nBitte belegen sie die Matrix B mit %d Werten\n", as*az);

		// Jetzt die Matrizen belegen
	for (i = 0; i < bs; i++)
	{	printf("Zeile %d = ", i+1); 
		for (j = 0; j < bz; j++)
			scanf("%d", & matrixB[i][j]);
	}

    // Matrize B zur kontrolle ausgeben
	for (i = 0; i < bs; i++)
	{	printf("\n"); 
		for (j = 0; j < bz; j++)
			printf("%d ",matrixB[i][j]);
		
	}
	 
	// Matrix berechnen

   for(f=0; f < az; f++)
     for(g = 0; g < bs; g++)
           matrixC[f][g] += matrixA[f][g] * matrixB[f][g];

	// Matrix C ausgeben
   
	for (f = 0; f < az; f++)
	{	printf("\n"); 
		for (g = 0; g < bs; g++)
			printf("%d ",matrixC[f][g]);
		
	}

	
return 0;
}
 
mit dieser entlosschleife wird die eingabe solange wiederholte bis die matrizen den richtigen wert haben
PHP:
while(1){
         //user eingabe

         ........

      if(as==bz)break;

        else printf("Die Matrizen lassen sich so nicht Multiplitzieren geben Sie neu Werte ein !!\n");
    }
 
mit dieser entlosschleife wird die eingabe solange wiederholte bis die matrizen den richtigen wert haben

PHP:
while(1){
         //user eingabe

         ........

      if(as==bz)break;

        else printf("Die Matrizen lassen sich so nicht Multiplitzieren geben Sie neu Werte ein !!\n");
    }

das war klar - da liegt auch kein fehler drinnen...

Im anderen Code waren einige Variablen vertauscht - das hab ich gefixed - siehe hier...

PHP:
    // Jetzt die Matrizen belegen
    for (i = 0; i < az; i++) //as -> az -> sonst wirds falsch angezeigt (bei den anderen auch - bist anscheined durcheinandergekommen)
    {    printf("Zeile %d = ", i+1); 
        for (j = 0; j < as; j++)
            scanf("%d", & matrixA[i][j]);
    }

    // Matrize A zur kontrolle ausgeben
    for (i = 0; i < az; i++)
    {    printf("\n"); 
        for (j = 0; j < as; j++)
            printf("%d ",matrixA[i][j]);
        
    }

    printf("\n\n\nBitte belegen sie die Matrix B mit %d Werten\n", bs*bz);

        // Jetzt die Matrizen belegen
    for (i = 0; i < bz; i++)
    {    printf("Zeile %d = ", i+1); 
        for (j = 0; j < bs; j++)
            scanf("%d", & matrixB[i][j]);
    }

    // Matrize B zur kontrolle ausgeben
    for (i = 0; i < bz; i++)
    {    printf("\n"); 
        for (j = 0; j < bs; j++)
            printf("%d ",matrixB[i][j]);
        
    }

Der fehler beim berechnen liegt hier:
PHP:
matrixC[f][g] += matrixA[f][g] * matrixB[f][g];

Du sagst hier eigentlich
PHP:
matrixC[f][g] = matrixC[f][g] + matrixA[f][g] * matrixB[f][g];
könnte auch sein das ich es nur falsch sehe ;)

Imho sollte die Funtkion eher so aussehen...
PHP:
matrixC[f][g] = ((matrixA[f][g]*matrixB[f][g])+(matrixA[f][g+1]*matrixB[f+1][g]));
da die Formel ja

btw solltest du testdaten brauchen dann kannst diese hier nehmen :)

Code:
Matrix A   Matrix B   Matrix C (Ergebnis)
-2 0        4 1 2       -8 -2 -4 
-1 2        4 2 0        4  3 -2 
 0 1                     4  2  0

noch eine Überlegung:
Jede Zeile in C (matrix C) ist eine Linarkombination der Zeile aus B und Jede Spalte in C ist eine LK der Spalte in A...

soll heißen:

-2*4 + 0*4 = -8
-2*1 + 0*2 = -2
-2*2 + 0*0 = -4

bzw...

-2*4 + 0*4 = -8
-1*4 + 2*4 = 4

usw... siehst du das System? Vielleicht kannst du´s dann einfacher schreiben...

OK
good lock :)

PS: wenn du willst, kann ich mir die Aufgabe am Wochenende mal genauer ansehen ... bis wann bräuchtest du es?
 
Zuletzt bearbeitet:
thx für dein hilfe und dein angebot !

Das Programm bräuchte ich bis samstag abend da ich noch ein doku in cweb schreiben muß montag früh um 8:00 uhr ist abgabe

mfg janosch
 
Zurück