# Matrix multiplikation --->net Help



## janosch (13. Oktober 2002)

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


----------



## Andreas Gaisbauer (13. Oktober 2002)

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: *

```
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:

```
|  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:

```
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...


----------



## janosch (15. Oktober 2002)

@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: 


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

oder so änlich

mfg janosch


----------



## Andreas Gaisbauer (15. Oktober 2002)

Hallo,

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


```
#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


----------



## janosch (17. Oktober 2002)

@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:


```
// 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   

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


----------



## Andreas Gaisbauer (17. Oktober 2002)

Hi,

könnte ich bitte mal den ganzen Code sehen - ich möchte wissen was der Compiler sagt 


Ciao Andreas


----------



## janosch (17. Oktober 2002)

jepp hier ist er


```
#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;
}
```


----------



## janosch (17. Oktober 2002)

mit dieser entlosschleife wird die eingabe solange wiederholte bis die matrizen den richtigen wert haben 

```
while(1){
         //user eingabe

         ........

      if(as==bz)break;

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


----------



## Andreas Gaisbauer (17. Oktober 2002)

> mit dieser entlosschleife wird die eingabe solange wiederholte bis die matrizen den richtigen wert haben
> 
> 
> ```
> ...



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

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


```
// 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:


> ```
> matrixC[f][g] += matrixA[f][g] * matrixB[f][g];
> ```



Du sagst hier eigentlich 

```
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...

```
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 


```
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?


----------



## janosch (17. Oktober 2002)

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


----------



## Andreas Gaisbauer (17. Oktober 2002)

Ok - versuchs selbst nochmal - ich kann dir´s leider nicht versprechen, hab selbst noch viel zu tun, aber wenn ich es schaffe schaue ich´s mir nochmal an...




CU  Andreas
-------------------------------------------------------------
"There are only 10 types of people in the world, those that understand binary, and those that don't."


----------



## janosch (17. Oktober 2002)

hmmm könnte es auch sein das ich einen fehler in der ausgabe der matrix c habe den da kommt immer eine riesen zahl raus auch nach dem ich dein änderungen mit einbezogen habe ?

mfg


----------



## Andreas Gaisbauer (17. Oktober 2002)

hmm... war eigentlich nicht beabsichtigt 

Deklariere die matrixA - matrixC als integer - nicht als double...

kann ich jetzt auf den ersten Blick auch nicht sagen -> kann sein das der Index irgendwo weiterläuft wo er nicht soll... 

Darfst du es auch mit Pointern lösen, oder seit ihr noch nicht so weit?


----------



## janosch (17. Oktober 2002)

Es wurde uns nur gesagt das wir es lössen sollen aber wie ist unserem Professor egal  

Naja unser Professor ist ein wenig abgehoben in Software Entwicklung für das was er von 2 wochen alten erstsemstern verlangt  

mfg janosch

P.S Pointer haben wir gerade erst angeschnitten


----------



## Andreas Gaisbauer (17. Oktober 2002)

Software Entwicklung im ersten Semester war bei uns auch ein "Ausscheidekriterium" -> 80 Erstsemester waren wir zu anfangs - heute - Anfang drittes Semster sind wir noch knapp 30...


----------



## janosch (18. Oktober 2002)

@crono

HI !

THX nochmal für deine Hilfe habe es jetzt hinbekommen     

*lol* das wann äckt        

Ich bin andauert mit der Multiplikation durcheinander gekommen sprich zeilen und spalten vertauchst*g* aber jetzt funst es *freu*

mfg janosch


----------



## Andreas Gaisbauer (19. Oktober 2002)

<mr.Burns-mode> Ausgezeichnet </mr.Burns-mode>


----------



## C-Greenhorn (12. Mai 2008)

Hallo !
Momentan stehe ich vor einem ähnlichen Problem und hab mich mal in das von euch erarbeitete Programm eingelesen. Soeben habe ich es kompiliert und mal ein paar Mal laufen lassen. 
Was mich stört : Die Ergebnisse stimmen nicht bzw. die Felder sind mit willkürlichen Werten belegt (etwa -1766544). Dementsprechend ist das Ergebniss unbefriedigend. 

Meine Idee : mittels for-Schleife jede Matrix einmal komplett auf 0 setzen. Jedoch hab ich keine Ahnung, wo und wie man das mal am besten machen könnte. Hat jemand einen Tipp


----------

