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 3int 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>undcoutsprechen 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
xundyverwenden. Ich finde diese Bezeichner sowieso besser alsfundg. Stattazundaswäre auchhoeheundbreitenicht 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,asundazsolche 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.