Produkt Matrix mal Vektor(AT*Y)



  • Das Problem liegt in diesen Zeilen:

    for(f=0; f<az; f++)
    {
    for(g=0; g<as; g++)
    {
    matrixC[g][f]= matrixA[g][f] * vek[f];
    }
    }

    hier wird das Produkt Y*AT gebildet, es soll aber das Produkt AT*Y gebildet werden.



  • Trotzdem könntest du die [cpp]-Tags verwenden, dann schaut man sich den Code nämlich viel eher an. 😉

    Damit ist die erste weisse Schaltfläche unter dem Eingabefeld gemeint, auf der "C/C++" steht. Indem du den Code markierst und auf die Schalfläche klickst, werden die Tags [cpp] und [/cpp] eingefügt, die Syntaxhighlighting und eine Monospaced-Schrift ermöglichen. Du kannst auch vor dem Einfügen des Codes ein erstes Mal auf die Schaltfläche klicken und danach erneut. Oder die Tags manuell aufschreiben.



  • [cpp]for(f=0; f<az; f++)
                               {
                                   for(g=0; g<as; g++)
                                    {
                                      matrixC[g][f]= matrixA[g][f] * vek[f];
                                      }
                                }
    

    alson okay, ich probier halt schon eine ewigkeit rum, aber ich komm nicht auf die lösung. Man muss die erste Zeile der Matrix mit der Vektorzeile multiplizieren.



  • Sorry, ich habe gar nicht gesehen, dass du ja noch ein offenes Problem hast. Etwas Mühe bei der Einrückung könntest du dir dennoch geben, zumal es ja den Vorschau-Button und die Edit-Funktion gibt.

    Ähm, du weisst aber, dass eine Matrix mit einem Vektor multipliziert wieder einen Vektor und keine Matrix (zumindest keine mit mehreren Spalten) gibt? Ich frage, weil du das Ergebnis in einer Matrix speichern willst.

    [m11 m12]  *  [v1]      =      [m11 * v1 + m12 * v2]
    [m21 m22]     [v2]             [m21 * v1 + m22 * v2]
    


  • ja mathematisch ist das schon klar, aber in c bekomm ichs nicht hin.



  • Reeko25 schrieb:

    ja mathematisch ist das schon klar, aber in c bekomm ichs nicht hin.

    Seit wann C? Das ist das falsche Forum. <iostream> und cout sprechen auch eher für C++.

    Und wenn es mathematisch klar ist, wieso willst du dann eine mehrspaltige Matrix als Resultat speichern?

    Ich kann mir auch nicht vorstellen, was so schwierig an dieser Implementierung ist. Du solltest vielleicht nicht nur herumprobieren, sondern das ganze auf Papier überlegen. Damit du doch noch etwas zum Denken hast, hier eine Pseudocode-Implementierung: 😉

    Setze Resulatvektor auf Nullvektor
    Für alle y kleiner als Matrixhöhe
    	Für alle x kleiner als Matrixbreite
    		Multipliziere Matrix-Eintrag [y,x] mit Vektor-Eintrag [x]
    		Addiere dieses Produkt zur Resulatvektorkomponente [y]
    


  • for(f=0; f<az; f++)
            {
             for(g=0; g<as; g++)
                       {
                                vekC[f]+= matrixA[g][f] * vek[f];
                       }
            }
    

    also so oder was ?



  • Nein. Wenn es wirklich so schwierig ist, das Beispiel umzusetzen, solltest du vielleicht direkt x und y verwenden. Ich finde diese Bezeichner sowieso besser als f und g . Statt az und as wäre auch hoehe und breite nicht schlecht. Du verstehst dann auch den Code viel schneller als bei kryptischen Zwei-Buchstaben-Variablen.



  • also

    vekC[y]=0;
    for(y<hoehe)
    for(x<breite)
    matrix[y,x]*vek[x]
    matrix[y,x]*vek[x]+vekC[y]



  • also

    vekC[y]=0;
    for(y<hoehe)
        for(x<breite) 
            matrix[y,x]*vek[x]
            matrix[y,x]*vek[x]+vekC[y]
    


  • //Matrix berechen
                     for(f=0; f<az; f++)
                               {
                                   for(g=0; g<as; g++)
                                      {    
                                      matrixA[g][f] * vek[f];
                                      vekC[f]= matrixA[g][f] * vek[f]+ vekC[f];
                                      }     
                                }
    
                     // Matrix C ausgeben
    
                     for (f = 0; f < az; f++)
                         {    cout<<"\n\n "; 
                                 for (g = 0; g < as; g++)
                                 cout<<"\n\n"<<vekC[f];
                         }
    

    hab den code jetz mal umgeschrieben allerdings kommt dann sowas raus:

    8

    8

    1.602e+238

    1.602e+238



  • Sorry, aber in meinem Pseudocode steht ja wirklich alles da. Wenn du C++ ein wenig kennst, kannst du den entsprechenden Code in sehr kurzer Zeit implementieren. Falls dir das Umdenken auf f , g , as und az solche Schwierigkeiten macht (offensichtlich tut es das, da du dauernd die Indizes durcheinander bringst), dann nimm doch wie bereits erwähnt meine Bezeichner! Du kannst sie ja anschliessend immer noch ersetzen. Aber versuch zuerst, eine vernünftige Implementierung zustande zu bringen.

    Hier nochmals:

    Setze Resulatvektor auf Nullvektor
    Für alle y kleiner als Matrixhöhe
    	Für alle x kleiner als Matrixbreite
    		Multipliziere Matrix-Eintrag [y,x] mit Vektor-Eintrag [x]
    		Addiere dieses Produkt zur Resulatvektorkomponente [y]
    

    Jetzt gehst du das Zeile für Zeile durch, schreibst das C++-Analogon hin und prüfst, ob wirklich alles stimmt. Schaue mehrmals, ob du dich nicht vertippt hast und ob die Indizes in der richtigen Reihenfolge und am richtigen Ort stehen.

    Falls du das nicht umsetzen kannst, musst du definitiv die Grundlagen nochmals gut anschauen. Es bringt dir nämlich rein gar nichts, wenn ich hier die fertige Lösung poste. Solange du nicht weisst, wie solche einfachen Dinge zu programmieren sind, kommst du nicht weiter. Besser, du lernst es gleich richtig, dafür kannst du es nachher auch selber.


Anmelden zum Antworten