[C/C++] Matrizenmultiplikation mit C

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von _zippo^, 2. November 2009 .

  1. 2. November 2009
    Matrizenmultiplikation mit C

    hallo programmiergemeinde,
    ich muss zwangsweise an der uni gerade C lernen,
    vorweg kann ich schonmal sagen, dass ich keinerlei erfahrung mit sonstigen programmiersprachen hab und mir die ganze sache daher unheimlich schwer fällt...
    ich hab jetzt folgenden code formuliert:
    Spoiler
    Code:
    #include <stdio.h>
    void main ()
    {
    const int n=3;
    int i, j, a;
    int m1[n][n];
    int m2[n][n];
    
     for (i=0; i<n; i++)
     {
     for (j=0; j<n; j++)
     {
     
     scanf("%d", &m1[i][j]);
     }
     }
     for (i=0; i<n; i++)
     {
     for (j=0; j<n; j++)
     {
     printf(" %d", m1[i][j]);
     }
     
     printf("\n");
     }
    
     for (i=0; i<n; i++)
     {
     for (j=0; j<n; j++)
     {
     
     scanf("%d", &m2[i][j]);
     }
     }
     for (i=0; i<n; i++)
     {
     for (j=0; j<n; j++)
     {
     printf(" %d", m2[i][j]);
     }
     
     printf("\n");
     }
    
    scanf("%d", &a);
    
    }

    sinn ist es dabei, dass man nacheinander 2 3x3-Matrizen mit beliebigen (integerbereich) werten erzeugt.

    frage ist nun, wie bekomme ich es hin, dass eine dritte matrize erstellt wird, die das produkt der beiden matrizen darstellt ???
    hatte mir dabei jetzt gedacht am ende des codes eine dritte matrize zu erstellen, und dabei die koordinaten der matrizen irgendwie manuell jeweils zu multiplizieren, aber so richt komme ich zu keinem ergebnis...

    falls es evtl einen weg über die einbindung besonderer library's gibt, dann wäre es zwar gut wenn ihr den erwähnt, die lösung sollte aber in obiger formatierung geschehen, da ich ja erstmal die grundlegenden dinge begreifen möchte...
    (codeverbesserungen vom obigen sind schon erwünscht)

    also riesen dank schonmal vorweg...

    gruß zippo
     
  2. 2. November 2009
    AW: Matrizenmultiplikation mit C

    Code:
    int m3[n][n];
    for(i=0; i < n; ++i) {
     for(j=0; j < n; ++j) {
     m3[i][j] = m1[i][j] * m2[i][j];
     }
    }
    
    In C++ gibt es die Klasse valarray, die genau für solche Dinge gedacht ist, denn sie implementiert verschiedene mathematische Operatoren, so dass man statt meiner Schleife einfach das * Zeichen benutzen könnte. Aber da ihr ja "nur" C benutzt, ist deine Lösung sehr gut geeignet.

    Weiterhin ist mir gerade noch aufgefallen, dass du void main() benutzt. Das ist meines Wissens nach falsch, eigentlich müsste es int main() heißen und demnach auch am Ende mit return 0; schließen.
     
  3. 2. November 2009
    AW: Matrizenmultiplikation mit C

    also du meinst also den code den du da geschrieben hast einfach mit einfügen und im oberen teil noch die m3[n][n] einfügen
    - das problem ist, dass das was du jetzt machst, bzw dein code^^, er multipliziert jedes element aus matrix 1 mit dem dazugehörigen element aus matrix 2
    also wenn quasi die erste spalte von matrix 1 die werte
    1
    1
    0
    hat und matrix 2
    2
    3
    1

    dann macht dein programm einfach
    1*2
    1*3
    0*1

    joa, glaub ich jedenfalls, und das widerum ist ungleich der matrizenmultiplikation...
    siehe:
    klick mich


    edit/ ps was ist der unterschied ob ich ein void main ohne return am ende mache oder int main mit return am ende mache?

    ist doch vom prinzip her das gleiche oder gibt es dann probleme mit der kompatibilität oder wie oder was ???
     
  4. 2. November 2009
    AW: Matrizenmultiplikation mit C

    Oh sry, da hast du recht, aber das liegt eher daran, dass ich nichts davon verstehe^^
    Kannst du bitte mal kurz erklären, was nun womit multipliziert werden muss? Dann kann ich dir auch bei deinem Code helfen

    Ansonsten zu der main-Funktion: Es ist so, dass (normalerweise) alle Programme einen Rückgabewert haben, anhand dessen festgestellt wird, ob es erfolgreich ausgeführt wurde oder ob es durch einen Fehler beendet werden musste.
    Soweit ich das weiß, kann man zwar auch void main() benutzen, allerdings ist das dann glaube ich nicht ANSI konform, allerdings übersetzen es viele Compiler trotzdem einfach.

    -------------------

    Soo, habs mir mitlerweile selbst angeeignet und hier ist (jetzt richtiger ) Code für dich:
    Code:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
     const int n=3;
     int m1[n][n] = { {1,2,3}, {4,5,6}, {7,8,9} };
     int m2[n][n] = { {1,2,3}, {4,5,6}, {7,8,9} };
     int m3[n][n];
    
     // zeilen in m1 und m3
     for(int i=0; i < n; ++i)
     {
     // spalten in m3 und m2
     for(int h=0; h < n; ++h)
     {
     int pre = 0;
     // spalte in m1; zeile in m2
     for(int j=0; j < n; ++j)
     {
     pre += m1[i][j] * m2[j][h];
     }
     m3[i][h] = pre;
     }
     }
    
     // ausgabe C++ style
     for(int i=0; i < n; ++i)
     {
     for(int j=0; j < n; ++j)
     {
     cout << m3[i][j] << "\t";
     }
     cout << endl;
     }
    
     return 0;
    }
    
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.