Produkt Matrix mal Vektor(AT*Y)



  • Folgendes Problem: Ich muss ein Programm schreiben, welches
    das Produkt der transponierten Matrix und der Matrix bildet, sowie
    das Produkt der transponierten Matrix mal einem Vektor.
    Mit dem Produkt Matrix mal Vektor habe ich noch Schwierigkeiten.

    Könnte mal jemand über das Programm schauen, das im Anhang ist ?

    #include<iostream>
    using namespace std;
    #include <stdio.h>
    #include <math.h>
    #define max 3

    int main (void)
    {
    char wahl;
    int as=0; //spalten matrix a
    int az=0; //zeilen matrix a
    int vz=0; //zeilen vektor
    int i=0; //counter
    int j=0; //counter
    int f=0; //counter
    int g=0; //counter
    double matrixA[max][max]; // Matrix
    double vek[max]; //Vektor
    double matrixC[max][max]; //ergebnis Matrix
    double vekC[max][max];
    double dim;
    double res[max];
    double mat[max][max];

    cout<<endl;
    cout<<"MENUEAUSWAHL: "<<endl;
    cout<<" "<<endl;
    cout<<"m: Multiplikation der transponierten Matrix mit der Matrix "<<endl;
    cout<<"v: Multiplikation der transponierten Matrix mit einem Vektor"<<endl<<endl;

    cin>> wahl;
    cout<<endl;

    switch(wahl)
    {
    case'm':
    {
    cout<<"Geben Sie die Dimensionen der transponierten Matrix ein\n";

    cout<<"Wieviel Zeilen hat die Matrix ?\n";

    cout<<"Zeilen = ";

    cin>>az;

    cout<<"Wieviel Spalten hat die Matrix ?\n";

    cout<<"Spalten = ";

    cin>>as;

    cout<<"Ihre Matrix hat das Format " << az << " auf " << as <<" \n";

    cout<<"\n\n\nBitte belegen sie die transponierte Matrix mit "<<as*az<<" Werten\n";

    // Jetzt die transponierte Matrix belegen
    for (i = 0; i < as; i++)
    { cout << "Zeile "<<i+1<<"= ";
    for (j = 0; j < az; j++)
    cin >> matrixA[i][j];
    }

    // Transponierte Matrix zur kontrolle ausgeben
    cout<<"\n\n Matrix AT";
    for (i = 0; i < as; i++)
    { cout <<"\n\n ";
    for (j = 0; j < az; j++)
    cout<<" "<<matrixA[i][j];
    }

    // Matrix A bilden
    cout<<"\n\n Matrix A";
    for (i = 0; i < as; i++)
    { cout << "\n\n ";
    for (j = 0; j < az; j++)
    cout<<" "<<matrixA[j][i];
    }

    // Matrix berechnen

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

    // Matrix C ausgeben

    cout<<"\n\n AT * A";
    for (f = 0; f < as; f++)
    { cout<<"\n\n ";
    for (g = 0; g < az; g++)
    cout<<" "<<matrixC[f][g];
    }
    break;
    }

    case'v':
    {
    while(1)
    {

    cout<<"Geben Sie die Dimensionen der transponierten Matrix ein\n";

    cout<<"Wieviel Zeilen hat die Matrix ?\n";

    cout<<"Zeilen = ";

    cin>>az;

    cout<<"Wieviel Spalten hat die Matrix ?\n";

    cout<<"Spalten = ";

    cin>>as;

    cout<<"Ihre Matrix hat das Format " << az << " auf " << as <<" \n";

    cout<<"Wieviel Zeilen hat ihr Vektor?\n";

    cout<<"Zeilen = ";

    cin>>vz;

    if(as==vz)break;

    else cout<<"Das Produkt der Matrix und des Vektor lassen sich nicht bilden. Geben Sie neu Werte ein !!\n";
    }

    cout<<"\n\n\nBitte belegen sie die transponierte Matrix mit "<<as*az<<" Werten\n";

    // Jetzt die transponierte Matrix belegen
    for (i = 0; i < as; i++)
    { cout << "Zeile "<<i+1<<"= ";
    for (j = 0; j < az; j++)
    cin >> matrixA[i][j];
    }

    // Transponierte Matrix zur kontrolle ausgeben
    cout << "\n\n Matrix AT ";
    for (i = 0; i < as; i++)
    { cout << "\n\n ";
    for (j = 0; j < az; j++)
    cout<<" "<<matrixA[i][j];
    }

    cout<<"\n\n\nBitte belegen sie den Vektor mit "<<vz<<" Werten\n";

    // Jetzt den Vektor belegen
    for (j = 0; j < az; j++)
    { cout << "Zeile "<<j+1<<"= ";
    cin >> vek[j];
    }

    // Vektor zur Kontrolle ausgeben
    {
    for (j = 0; j < az; j++)
    cout<<" \n\n"<<vek[j];
    }

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

    // Matrix C ausgeben

    for (f = 0; f < az; f++)
    { cout<<"\n\n ";
    for (g = 0; g < as; g++)
    cout<<" "<<matrixC[g][f];
    }

    break;
    }
    }

    return 0;
    }



  • Reeko25 schrieb:

    Folgendes Problem: Ich muss ein Programm schreiben, welches
    das Produkt der transponierten Matrix und der Matrix bildet, sowie
    das Produkt der transponierten Matrix mal einem Vektor.
    Mit dem Produkt Matrix mal Vektor habe ich noch Schwierigkeiten.

    Könnte mal jemand über das Programm schauen, das im Anhang ist ?

    Ich hab mal schnell drüber geschaut. Aber auch wirklich nur drüber geschaut. Der Code ist nämlich viel zu lang, vielleicht soltlest du ihn auf die Stellen reduzieren, mit der du Probleme hast. Ich hab sie jetzt so nicht gefunden. Wenn du dann auch noch die [cpp]-Tags benutzt ist er auchnoch besser lesbar. Lies bitte auch den Link in meiner Signatur einmal durch.



  • 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