korrekturleser für matrix-vektormultiplikation gesucht



  • hallo,

    für eine aufgabe musste ich ein programm schreiben, das matrizen mit vektoren multipliziert. ich habe nun schon einige stunden damit verbracht, bekomme aber leider kein laufendes programm zustande. der quelltext ist meiner meinung nahezu vollständig und größtenteils korrekt, aber es werden einige syntaxfehler drinnen sein, die ich als anfänger nicht finde bzw. nicht korrigieren kann.

    hat jemand lust sich das ding (120 zeilen) mal anzuschauen?

    möchte es nicht unbedingt öffentlich posten, da es einerseits ziemlich groß ist und andererseits nicht unbedingt von dem betreuer gefunden werden soll 😛

    danke und gruß



  • Wenn du so konservativ mit deinem Code umgehst, dann wird das hier wahrscheinlich nix. Allerdings hatten wir Matrizen hier schon des öfteren und kannst dich mal mit der Forensuche (oder eher mit google) auf die Suche machen.

    Ansonsten üb dich mal mit dem Debugger. Viel mehr kann ich so jetzt auch nicht sagen.. Aber der Debugger ist dein Freund und mit dem an der Hand + sehr viel Zeit kannst du grundsätzlich alles finden.



  • AUFGABENSTELLUNG

    Implementieren Sie zwei Klassen matrix und vector.
    Die Klasse matrix soll folgendes enthalten (verwenden Sie keine inline Funktionen):
    - Als private Datenelement:
    - Ein (n x n)-dimensionales Feld daten mit n2 Komponenten vom Typ double**.
    - Eine Variable n vom Typ int, die die Dimension des Feldes abspeichert.
    - Als public Elementfunktionen:
    - Einen Konstruktor mit einem Argument vom Typ int, für die Dimension der Martix
    und einen Argument vom Typ double zur Initialisierung der Komponenten. Dabei soll jede Komponente der Matrix den Wert des Arguments vom Typ double erhalten. Des Weiteren achten Sie darauf, dass die Matrix dynamisch erzeugt wird. Als Default-Wert soll Null gewählt werden.
    - Eine Elementfunktion norm() ohne Argumente mit Ergebnistyp double, die die Spaltenbetragssummennorm des aufrufenden Objektes berechnet.
    - Einen Multiplikationsoperator * mit einem Argument vom Typ vector und Ergebnistyp vector, der das Produkt einer Matrix mit einem Vektor, wie oben beschrieben, berechnet.
    - Als friend Funktion:
    - Einen Operator >> zur Eingabe einer Matrix von einem istream. Dabei soll die Matrix zeilenweise eingelesen werden.

    Implementieren Sie die Klasse vector, die folgendes enthalten soll (verwenden Sie keine inline Funktionen):
    - Als private Datenelement:
    - Ein Feld daten mit n Komponenten vom Typ double*.
    - Als public Elementfunktionen:
    - Einen Konstruktor mit einem Argument vom Typ int, für die Dimension des Vektors und einen Argument vom Typ double zur Initialisierung der Komponenten. Dabei soll jede Komponente des Vektors den Wert des Arguments erhalten. Des Weiteren achten Sie darauf, dass der Vektor dynamisch erzeugt wird. Als Default-Wert soll Null gewählt werden.
    - Einen Indexoperator [] mit einem Argument vom Typ int. Bei Aufruf des Operators [] mit dem aktuellen Argument i soll als Ergebnis eine Referenz auf die i-te Komponente des Feldes zurückgegeben werden. Falls i nicht im gültigen Indexbereich liegt, soll durch den Funktionsaufruf exit(1) das Programm abgebrochen werden. Dies dient später zum Einlesen des Vektors.
    - Als friend Funktionen:
    - Einen Operator << zur Ausgabe eines Vektors.
    - Den Multiplikationsoperator der oben beschriebenen Klasse matrix.
    Schreiben Sie ein Hauptprogramm, das ein Objekt A vom Typ matrix und ein Objekt b vom Typ vector definiert und einliest. Danach soll die Spaltenbetragssummennorm von A und das Produkt A*b von A und b ausgegeben werden. Bei erfolgreicher Beendigung des Programms soll
    der Wert 0 an das Betriebssystem zurückgegeben werden. Vergessen Sie nicht allen dynamisch allokierten Speicherplatz wieder zu löschen.



  • CODE

    #include <iostream>
    using namespace std;

    class vector;

    class matrix
    {
    private:
    int n;
    double** daten;

    public:
    matrix(int n, double = 0);
    ~matrix();
    double norm();
    vector operator *(vector x);

    friend istream& operator >> (istream& is, matrix& x);
    };

    class vector
    {
    private:
    int n;
    double* daten;

    public:
    vector(int n, double = 0);
    ~vector();
    double& operator [](int i);

    friend vector matrix::operator *(vector x);
    friend ostream& operator << (ostream& os, vector& x);
    };

    matrix::matrix(int n, double defaultzero)
    {
    double** daten = new double* [n];
    for(int i=0; i<n; i++) daten[i] = new double [n];

    for(int i=0; i<n; i++) for(int j=0; j<n; j++) daten[i][j]=defaultzero;
    }

    matrix::~matrix()
    {
    for(int i=0; i<n; i++) delete[] daten[i];
    delete[] daten;
    }

    double matrix::norm()
    {
    double* summe = new double [n];

    for(int j=0; j<n; j++) summe[j]=0;

    for(int j=0; j<n; j++) for(int i=0; i<n; i++) summe[j] += daten[i][j];

    for(int j=n-1; j>=0; j--) summe[j]=max(summe[j],summe[j+1]);

    double ret = summe[0];

    delete[] summe;

    return ret;
    }

    vector matrix::operator *(vector x)
    {

    }

    istream& operator >> (istream& is, matrix& x)
    {
    cout << "Bitte geben Sie die Matrix zeilenweise ein! \n \n";

    for(int i=0; i<x.n; i++) for(int j=0; j<x.n; j++) is >> x.daten[i][j];

    return is;
    }

    double& vector::operator [](int i)
    {
    if(i>=n) exit(1);
    return daten[i];
    }

    ostream& operator << (ostream& os, vector& x)
    {
    for(int i=0; i<x.n; i++) os << x.daten[i] << "\n";

    return os;
    }

    vector::vector(int n, double defaultzero)
    {
    double* daten = new double[n];

    for(int i=0; i<n; i++) daten[i]=defaultzero;
    }

    vector::~vector()
    {
    delete[] daten;
    }

    int main()
    {
    int dim;
    cout << "Bitte geben Sie die Dimension ein! \n \n";
    cin >> dim;
    cout << "\n";

    matrix A(dim);
    vector b(dim);

    cin >> A;
    for(int i=0; i<dim; i++) cin >> b[i];

    cout << A.norm();

    vector l(dim);
    l = A*b;
    cout << l;

    system("PAUSE");
    return 0;
    }

    PROBLEM

    wie man seht fehlt mir einerseits die eine elementfunktion noch und andererseits scheint das bisher programmierte auch nicht zu laufen. wenn ich beispielsweise eine matrix erstelle und einlesen oder einen vektor erstelle und ausgeben möchte, stürzt das programm direkt ab. diese funktionen beinhalten also wahrscheinlich auch einige fehler, die ich aber nicht finden kann, weil mir das mit der syntax alles nicht so verständlich ist.

    ich hoffe jemand kann mir sagen, wo jeweils das problem liegt 😞



  • möchte es nicht unbedingt öffentlich posten, da es einerseits ziemlich groß ist und andererseits nicht unbedingt von dem betreuer gefunden werden soll 😛

    ...wenn der Betreuer überhaupt nach sowas im Internet guggt - nach der Qualität von Skript und Übungsblättern zu urteilen, eher nicht. 🤡

    Ich leide mit Dir, und habs jetzt nach langer Arbeit selbst fertig.. Wenn ich Dir also helfen kann... Bin leider nicht an der Uni, weil ich zur Zeit krank bin.

    Werd mir den Code mal anschauen und vergleichen. Du hast aber auch schon ne Menge Mühe reingesteckt... Ich schaus mal durch...

    Bist du eigentlich TeMa oder hörst Du freiwillig? Oder gibts noch mehr arme Schlucker, die das hören müssen?



  • Zeile 56 (in meinem Editor):

    for(int j=0; j<n; j++) for(int i=0; i<n; i++) summe[j] += daten[i][j];
    

    Es muss die Betragsspaltenwieauchimmernorm sein, also Betrag (fabs()) um die Daten und dazu <cmath> einbinden.

    Zeile 58:

    for(int j=n-1; j>=0; j--) summe[j]=max(summe[j],summe[j+1]);
    

    Das funktioniert so nicht. Die Schleife fängt bei n-1 an. Dann ist summe[j+1] nicht definiert, denn summe[n] gibt es nicht.

    vector matrix::operator *(vector x)
    {
    
    }
    

    Das ist ein Dreizeiler. Den kriegste locker hin, wenn Du den Rest bis hierher so schadlos überstanden hast!

    Zeile 81:

    double& vector::operator [](int i)
    {
    if(i>=n) exit(1);
    

    Funktioniert deshalb nicht, weil n undefiniert ist. Lt Aufgabenstellung ist die Variable n in der Vektorklasse gar nicht vorgesehen. Du hast sie intelligenterweise selbst hinzugefügt, aber vergessen, im Konstruktor den übergebenen Wert zu speichern.

    Guter Tip, den ich hier im Forum bekommen habe: Member-Variablen, also Variablen, die direkt zum Objekt gehören, mit einen Präfix (ich nehme immer m_) kennzeichnen.

    Dein Problem ist, dass Du hier (Zeile 94)

    vector::vector(int n, double defaultzero)
    

    als Argument den Integer n übergibst. Der "lebt" aber nur solange, bis der Konstruktor beendet ist, also sobald das Objekt erschaffen wurde. Frag weiter nach, wenn Dus nicht verstehst, ich hatte da auch so meine Probleme...

    Das wars fürs Erste, vielleicht tuts danach ja schon. Allgemein würde ich dir empfehlen, ab und an mehr Text auszugeben, damit Du, wenn das Programm läuft, auch weißt, was es tut und getan hat. Vor allem dann, wenn du nach Programmierfehlern suchst...



  • danke, bin mittlerweile auch durch.

    aber einen fehler hab ich noch im nachhinein gefunden dank deines kommentars 🙂

    weißt du, ob und wo es alte klausuren gibt?

    wenn nicht, dann verrat mir doch bitte den link zu diesem mathe-forum.

    ali09@partybombe.de


Anmelden zum Antworten