Matrizen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Moin!
    Ich habe folgende Aufgabe:

    In dieser Aufgabe sollen Sie eigenständig aus einer gegeben Problemstellung eine
    Klasse Matrix implementieren. Die Klasse Matrix soll eine zweidimensionale Matrix
    enthalten und folgenden Operationen ermöglichen:
    • Addition zweier Matrizen
    • Skalarmultiplikation
    • Matrizenmultiplikation
    • Berechnung der Transponierten einer Matrix

    Die Matrix enthält nur Elemente vom Typ long.
    Um diese Aufgabe zu lösen gehen Sie wie folgt vor:
    1. Rufen Sie sich die mathematischen Hintergrund in Erinnerung
    2. Überlegen Sie sich welche Attribute und Funktionen benötigt werden
    3. Zeichnen Sie ein Diagramm Ihrer Klasse
    4. Implementieren Sie Ihre Klasse
    5. Schreiben Sie ein geeignetes Hauptprogramm, welches die Funktionen
    Ihrer Klasse demonstriert.
    matrix.h

    Quellcode

    1. #ifndef MATRIX #define MATRIX class Matrix{ private: int spalte, zeile; long number; long matrix[][]; public: Matrix(const int, const int); //~Matrix(); void print(); //void add(); }; #endif


    matrix.cpp

    Quellcode

    1. #include #include "matrix.h" using namespace std; Matrix::Matrix(const int zeile, const int spalte):this->zeile(zeile),this->spalte(spalte) { for(int i=0; i<< matrix[i][k]; }


    main.cpp

    Quellcode

    1. #include #include "matrix.h" using namespace std; int main(void) { int x1, y1, x2,y2; cout << "1. Matrix: Wieviele Zeilen: "; cin >> x1; cout << "1. Matrix: Wieviele Spalten: "; cin >> y1; cout << "2. Matrix: Wieviele Zeilen: "; cin >> x2; cout << "2. Matrix: Wieviele Spalten: "; cin >> y2; Matrix ma1(x1,y2); Matrix ma2(x2,y2); ma1.print(); ma2.print(); return 0; }


    jetzt bringt er mir ständig den Fehler, dass die Feldindizes des Arrays in der Klasse fehlen.

    Kann mir jemand sagen, wie ich richtig mache?
  • falsch: google.com/search?hl=de&q=stl+vector&lr=lang_de
    vector<long double> Vektor;
    kann einiges

    und eine Matrix kann man ja im Konstruktor schon festsetzen:
    Matrix(4,5);
    und man speichert die Einträge eben innem Doppelarray, wobei
    man die Dimensionen auch speichern sollte und die Zugriffe kapseln sollte.

    Nun macht man für die Operationen einfache Memberfunktionen, wie
    Addiere( Matrix rechteSeite);
    dann kann man schonmal M.Addiere(N) machen beispielsweise.

    Für nen Operator schreibt man dann, erstma ohne Zeiger, oder Referenz-Tricks:
    Matrix operator+(Matrix rechts)
    {
    /* prüfe Dimensionen der aktuellen unn der rechten Matrix,
    sonst - naja verkleinern *was mathematisch falsch ist* oder Exception machen. */
    A = Matrix(spalten, zeilen);
    A = (this*).Addiere(rechts);
    return A;
    }

    hm das kann man natürlich für Speichereffizienz beliebig verkomplizieren die Sache,
    aber das ist ja nicht die Aufgabenstellung :)

    P.S. als Ausgabe kann man auch für cout nen Operator << definieren, der als rechte
    Seite ne Matrix frisst, dann kann man locker schreiben:

    cout << A; // das is cool, wenn's funktioniert

    Aber kompletten Code kann ich Dir nicht senden, weil ich das erstmal nur mit Vektoren
    gemacht habe (mit der STL) und auch generell zu faul bin :D

    und überhaupt mit Referenzen wird alles so kompliziert, da muss man dann konstante
    Funktionen hier und Kopierkonstruktor dort - das war mir zuviel Nachgedenke dann.
    Mit Zeigern ginge auch einiges, DA würde man aber das objektorientierte Gesamtkonzept
    verlassen müssen.

    Edit: In Übungsaufgaben ist eh Standard, sich per DEFINE ne Konstante zu wählen, dann
    interessiert die Laufzeit keinen mehr :-), dann ist alles in der Compilezeit aufgelöst worden.
  • hier mein Vektormist:

    Quellcode

    1. #define typ double
    2. #include<vector>
    3. #include<iostream>
    4. #include<iomanip>
    5. #include<math.h>
    6. using namespace std;
    7. /* Vektor */
    8. class Vektor
    9. {
    10. public:
    11. Vektor()
    12. { };
    13. Vektor(int dim)
    14. {
    15. SetDim(dim);
    16. };
    17. Vektor(typ* array, int dim)
    18. {
    19. for (int i = 0; i < dim; i++)
    20. {
    21. m_Vektor.push_back(array[i]);
    22. }
    23. SetDim(dim);
    24. };
    25. ~Vektor()
    26. {
    27. };
    28. Vektor Add(Vektor& b)
    29. {
    30. int maxDim = 0;
    31. if(GetDim() < b.GetDim())
    32. {
    33. maxDim = GetDim();
    34. }
    35. else
    36. {
    37. maxDim = b.GetDim();
    38. }
    39. Vektor A = Vektor(maxDim);
    40. for (int i = 1; i <= m_Dim; i++)
    41. {
    42. A.SetKomp(i, GetKomp(i) + b.GetKomp(i));
    43. }
    44. return (A);
    45. };
    46. typ Skal(Vektor& b)
    47. {
    48. int maxdim;
    49. typ wert = 0.0;
    50. if((*this).m_Dim < b.GetDim())
    51. {
    52. maxdim = (*this).m_Dim;
    53. }
    54. else
    55. {
    56. maxdim = b.GetDim();
    57. }
    58. for (int i = 1; i <= maxdim; i++)
    59. {
    60. wert += GetKomp(i)*b.GetKomp(i);
    61. }
    62. return wert;
    63. };
    64. typ Norm()
    65. {
    66. return( sqrt(Skal(*this)));
    67. };
    68. Vektor Mult(typ zahl)
    69. {
    70. Vektor neu = Vektor(GetDim());
    71. for (int i = 1; i <= GetDim(); i++)
    72. {
    73. neu.SetKomp(i, GetKomp(i)*zahl);
    74. }
    75. return (neu);
    76. };
    77. ostream& Ausgabe(ostream& output)
    78. {
    79. output << "[";
    80. output << setw(5) << right << showpos; // <<scientific << showpoint;
    81. for (int i = 0; i < m_Dim; i++)
    82. {
    83. output << m_Vektor[i];
    84. if (i < m_Dim-1)
    85. {
    86. output << ", ";
    87. }
    88. }
    89. output << "]";
    90. return output;
    91. };
    92. typ GetKomp(int komp)
    93. {
    94. if ((komp > 0) && (komp <= GetDim()))
    95. {
    96. return m_Vektor[komp-1];
    97. }
    98. else
    99. {
    100. return 0;
    101. }
    102. };
    103. bool SetKomp(int komp, typ wert)
    104. {
    105. if ((komp > 0) && (komp <= GetDim()))
    106. {
    107. m_Vektor[komp-1] = wert;
    108. return true;
    109. }
    110. else
    111. {
    112. return false;
    113. }
    114. };
    115. int GetDim()
    116. {
    117. return m_Dim;
    118. };
    119. void SetDim( int dim)
    120. {
    121. m_Vektor.resize(dim);
    122. m_Dim = dim;
    123. };
    124. Vektor operator+(Vektor& b)
    125. {
    126. Vektor A = Add(b);
    127. return A;
    128. }
    129. typ operator*(Vektor& b)
    130. {
    131. return this->Skal(b);
    132. }
    133. Vektor operator*(typ k)
    134. {
    135. Vektor A = Mult(k);
    136. return (A);
    137. }
    138. private:
    139. int m_Dim;
    140. vector<double> m_Vektor;
    141. };
    142. ostream& operator <<(ostream& str, Vektor vek)
    143. {
    144. return(vek.Ausgabe(str));
    145. }
    146. int main()
    147. {
    148. typ A[7] = {2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0};
    149. typ B[6] = {3.0, 2.0, 1.0, 4.0, 8.0, 9.0};
    150. Vektor X = Vektor(A, 7);
    151. Vektor Y = Vektor(B, 6);
    152. Vektor Z(7);
    153. cout << "X: " << X << X.GetDim() << "\n";
    154. cout << "y: " << Y << Y.GetDim() << "\n";
    155. Z = X + Y;
    156. cout << "Z = X + Y: " << X.Add(Y) << Z.GetDim() << "\n";
    157. cout << "<x,y> = " << X.Skal(Y) << ",\n";
    158. cout << "<y,x> = " << Y.Skal(X) << ",\n";
    159. cout << "<z,z> = " << Z.Skal(Z) << ".\n";
    160. cout << "||z|| = " << Z.Norm() << ", ";
    161. cout << "||z||^2 = "<< pow(Z.Norm(),2.0) << "!\n";
    162. cout << "3*z = " << Z.Mult(3.0) << "\n";
    163. cout << "X * Y: " << (X * Y) << "\n";
    164. cout << "X * 2.0" << (X * 2.0) << "\n";
    165. cout << "X + Y: " << (X + Y) << "\n";
    166. cout << "((X + Y ) * 2.0)" << ((X + Y) * 2.0) << "\n";
    167. getchar();
    168. return 0;
    169. }
    Alles anzeigen


    Ja zugegeben, es ist primitiv, aber es funktioniert *glaub ich* halbwegs, ich hatte auch ma mit Referenzen probiert, aber da wurde zum Beispiel bei einer Multiplikation in cout << (X * 2.0) immer genau der Vektor multipliziert, und bei cout << X kam dann der doppelte Vektor raus, das war doof :)

    Übrigens im Thread unten steht als verwandtes Thema was mit ner Matrix Klasse.

    Hm UND ich bin mir nicht exakt sicher, wo hier implizite Sachen drinstecken, die C++ für mich macht, ohne dass ich's merk, z.B. die Zuweisung Z = X + Y, das hatte ich auch mal im Quellcode stehn, sollte auch gehen, jedoch habe ich weder die Zuweisung, noch eine Konstruktor-Funktion Vektor( Vektor originial) implementiert - also war bei der Sache auch etwas Glück dabei ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von zyklo ()