Matrixmultiplikation



  • Hallo, ich scheitere gerade an der Matrixmultiplikation, und zwar bekomme ich immer einen Überlauf nur ich seh vor lauter Bäumen den Wald nicht mehr, sitze schon seit Heute morgen dran 😞 Vielleicht seht ihr den Fehler 🙂 Hier ist der entsprechende Code dafür.

    for(i = 0; i < MatrixARow; i++)                                
    {                                                               
        for(j = 0; j < MatrixBColumn; j++)                        
    	{                                                           
    		Result[i][j] = 0.0; //Stelle mit 0 Initialisieren 
    
    		for(k = 0; k < MatrixAColumn; k++)                     
    		{                                                   
    			Result[i][j] += MatrixA[i][k] * MatrixB[k][j];
    		}
    		printf("%f\n",Result[i][j]);
    	}                                                           
    }
    

    MatrixARow besitzt den Wert 31
    MatrixBColumn 1 <-- Vektor
    MatrixAColumn 7

    Vielen Dank schonmal im Vorraus



  • Bummi1983 schrieb:

    MatrixARow besitzt den Wert 31
    MatrixBColumn 1 <-- Vektor
    MatrixAColumn 7

    Vielen Dank schonmal im v******

    Vielleicht hättest Du's besser gleich mit defines und Variablendeklarationen hergegeben, wie sind denn Deine Arrays angelegt?
    "Überlauf" ist schon ziemlich schwammig ...



  • Ich dachte das die Funktion nicht richtig implementiert ist.

    MatrixA MatrixB und Result werden per Pointer in der Form ** MatrixA übergeben. Bei MatrixB handelt es sich nicht direkt um einen Vektor als Datentypen.



  • Bummi1983 schrieb:

    MatrixA MatrixB und Result werden per Pointer in der Form ** MatrixA übergeben

    Das geht nur, wenn eine Dimension zur Compiletime fix ist.
    Für die grundlegende Richtigkeit des Algorithmus bist Du verantwortlich, Du kannst nicht erwarten, daß hier das der Trffpunkt für Mathefuzzis ist.
    Vermutlich übergibst Du an die Funktion was anderes, als Du denkst oder knackst ein Limit der Arraygrenzen.
    Vermutlich multiplizierst Du gerade nur Speichermüll, stimmt's?



  • pointercrash() schrieb:

    Bummi1983 schrieb:

    MatrixA MatrixB und Result werden per Pointer in der Form ** MatrixA übergeben

    Das geht nur, wenn eine Dimension zur Compiletime fix ist.

    Falsch.



  • Tim schrieb:

    pointercrash() schrieb:

    Bummi1983 schrieb:

    MatrixA MatrixB und Result werden per Pointer in der Form ** MatrixA übergeben

    Das geht nur, wenn eine Dimension zur Compiletime fix ist.

    Falsch.

    Jupp, ich habe ja MatrixARow .... als Parameter der Funktion mit übergeben die Funktion soll ja rein dynamischer Natur sein, so dass mit den Größenangaben die Ergebnissmatrix berechnet werden kann



  • wie baust du die matrizen auf?

    #define ROWS 11
    #defein COLUMNS 13
    
    int foo[ROWS][COLUMNS];
    
    // ...oder...
    
    oder int **foo = malloc(sizeof(int*) * ROWS);
    for (i = 0; i < ROWS; i += 1) foo[i] = malloc(sizeof(int) * COLUMNS);
    


  • Tim schrieb:

    pointercrash() schrieb:

    Das geht nur, wenn eine Dimension zur Compiletime fix ist.

    Falsch.

    Tim, warum stellst du nicht eine Frage statt so eine nutzlose Antwort zu geben?



  • weltnichtmehrversteher schrieb:

    Tim schrieb:

    pointercrash() schrieb:

    Das geht nur, wenn eine Dimension zur Compiletime fix ist.

    Falsch.

    Tim, warum stellst du nicht eine Frage statt so eine nutzlose Antwort zu geben?

    Wieso sollte ich eine Frage stellen? Und warum sollte meine Antwort nutzlos sein?



  • cracki schrieb:

    wie baust du die matrizen auf?

    #define ROWS 11
    #defein COLUMNS 13
    
    int foo[ROWS][COLUMNS];
    
    // ...oder...
    
    oder int **foo = malloc(sizeof(int*) * ROWS);
    for (i = 0; i < ROWS; i += 1) foo[i] = malloc(sizeof(int) * COLUMNS);
    

    Ich tu den Speicher Dynamisch allokieren. So wie ich es verstanden habe,

    oder int **foo = malloc(sizeof(int*) * ROWS); sind es ja die Zeilen.



  • Ok hat sich erledigt, ich hatte einen Dreher in der Speicherallokierung drin, und der hat sich durch das gesamte Programm durchgezogen bis an die Stelle wo es doch mal kritisch wird. Trotzdem vielen dank den Leuten 🙂 Damit auch in Zukunft jemand was davon hat, hier der Code wie ich mittels Größenangabe dynamisch 2 Matrizen Multipliziere.

    void Mva_MatrixMult(double** MatrixA, double** MatrixB, double** Result, int MatrixARow, int MatrixAColumn, int MatrixBColumn)
    {
       unsigned int i, j, k;
    
       for(i = 0; i < MatrixARow; i++)                                
    	{                                                               
    		for(j = 0; j < MatrixBColumn; j++)                        
    		{   
    			Result[i][j] = 0.0;
    			for(k = 0; k < MatrixAColumn; k++)                     
    			{                                                   
    			     Result[i][j] += MatrixA[i][k] * MatrixB[k][j];
    
    			}                                                           
    		}
    	  }
    


  • weltnichtmehrversteher schrieb:

    Tim, warum stellst du nicht eine Frage statt so eine nutzlose Antwort zu geben?

    Du weißt doch, wie das ist mit den Frauen und ihren Tagen 🙄 . Die sind dann halt einfach manchmal nicht gut drauf 😉 .

    Ich wollte sichergehen, daß Bummi nicht versucht, auf solche Art ein Array durchzupressen (das compiliert nämlich prächtig):

    void foo(double **matrix)
    {
    	matrix[2][1] = 10;
    	// do something
    }
    
    void bar(void)
    {
    	double mat_a[3][4];
    	foo((double **)mat_a);
    }
    

    @Bummi1983:
    Wenn Du künftig Fragen hast, bitte die relevanten Sachen gleich mit beigeben (also Funktionsheader, Deklaration der betroffenen Vars, im Idealfall ein Stück, das compiliert und den Fehler zeigt.
    Dann muß man Dir nicht alles einzeln "aus der Nase ziehen". 🙂



  • pointercrash() schrieb:

    weltnichtmehrversteher schrieb:

    Tim, warum stellst du nicht eine Frage statt so eine nutzlose Antwort zu geben?

    Du weißt doch, wie das ist mit den Frauen und ihren Tagen 🙄 . Die sind dann halt einfach manchmal nicht gut drauf 😉 .

    Lern mal mit Kritik klarzukommen.



  • ^^ los, prügelt euch!
    🙂



  • ~fricky schrieb:

    ^^ los, prügelt euch!
    🙂

    Och, ist doch nur der kleine Timmy mit seinen Launen. Das soll seine Mami regeln ... 😉


Anmelden zum Antworten