Matrix

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Matrix
Ich verstehe nicht wie wir die Matrix bilden sollen. Anscheinend nicht mit vector, wie dann mit Arrays auf dem heap? muss dann T* _data nicht T** sein?


Das hängt davon ab.
Man kann eine 2×2 matrix auch darstellen mit einem Array[4]… {i11, i12, i21, i22} oder {i11, i21, i12, i22}

Grüße,
F


wie verstehe muss ich die Matrix in ein Array schreiben


es gibt ja auch einen Konstruktor, wo ich die T* data uebergeben bekomme, und ich muss wissen wie da die Daten dargestelt werden um sie richtig zu interpretieren, ich hoffe standartmaessig


Diesen Konstruktor wo T * data uebergeben wird musst du nicht implementieren und wird auch bei Abgabe nicht bewertet.


Bei Matrix-Matrix und Matrix-Skalar multiplikation stehen bei der Überladung des operators* standardmäßig als return *this;
Soll das ein hinweis darauf sein, dass die multiplikation auf dem this stattfindet? Oder soll man eine neue Matrix zurückgeben?
Mit Beispiel um meine Frage zu verdeutlichen:
a,
m1 * m2 => m1 wird zum ergebnis der multiplikation
b,
m3 = m1 * m2 => m3 wird zum ergebnis der multiplikation, m1 bleibt unverändert. ( in diesem Bsp ist operator= schon überladen )

thx


[quote=Cellus]
Bei Matrix-Matrix und Matrix-Skalar multiplikation stehen bei der Überladung des operators* standardmäßig als return *this;
Soll das ein hinweis darauf sein, dass die multiplikation auf dem this stattfindet? Oder soll man eine neue Matrix zurückgeben?[/quote]

Man soll eine neue Matrix zurückgeben, das *this steht nur da, damit man es compilieren kann.
Denn sonst würde man bei:
m3 = m1 * m2 das zwar in m3 das richtige Ergebnis drinstehen, aber m1 wäre dann fälschlicherweise auch verändert


K thx.

Jetzt ist bei mir noch ne Frage aufgekommen:

beim operator==
m1 und m2 haben verschiedene dimensionen
soll dann m1==m2 ein “false” zurück geben oder soll dieser fall durch eine assertion abgefangen werden?

Noch etwas off-topic:
weiß wer ob die freitagsübung trotz tag der informatik stattfindet


false fände ich sinnvoller.


Es muss false zurueckgegeben werden! Kein Assert oder sonstige Fehlerbehandlungen bitte (das ist naemlich kein Fehler).


Eine Freitagsübung gibt es meines Wissens nicht… ^^
Die Vorlesung am Freitag fällt auf jeden Fall aus.


Ok.
ahja. Da bin ich grad wegen freitag mit SysProg durcheinander gekommen ^^


mal zurück zum Topic:

soll man auch folgenden Fehler abfangen:

Matrix m1(3,1);
Matrix m2(3,1);
if(m1 == m2){

und geht das überhaupt in C++?


Beim Vergleichsoperator sollte man doch komponentenweise prüfen, ob die Elemente gleich sind (also Aij == Bij) und nicht nur überprüfen, ob die Matrizen die gleiche Größe haben.

Wenn natürlich an jeder Stelle die Werte in float und int gleich sind (z.B. 2.0 == 2), dann wird das auch true geben. Zumindest hab ich das so gelöst.


Das wird ohnehin nicht kompilieren; der operator==(Matrix &other) wie er vorgegeben ist kann nur eine Matrix selben Typs (T) vergleichen.


Oh jetz aber. Wenn man streng der Regel folgt, dass Operationen auf Matrizen die nicht die passenden Dimensionen haben ein Fehler sind, dann ist das auch ein Fehler. In numerischen Codes ist das denke ich durchaus üblich – wenn diese Checks nicht aus Effizienzgründen gleich ganz weggelassen werden. Außerdem ist es nicht in der Angabe spezifiziert.


Alleine der gesunde Menschenverstand sagt einem doch, das eine 2x2 Matrix != einer 3x3 Matrix ist. Das ist kein Fehler, sondern ein false.
Da gibt es auch nichts zu spezifizieren imho.

== ist nunmal ein Vergleich und keine mathematische Operation.


Lassen wir den gcc doch mal gesunden Menschenverstand benutzen:

Matrix<float> a(3,3);
Matrix<float*> b(3,3);
a==b;

Der gesunde Menschenverstand sagt einem hier, dass eine Matrix mit floats immer ungleich einer Matrix von pointern ist (Äpfel != Birnen). Trotzdem ist es ein Fehler sie zu vergleichen:

|| g++ -Wall -g -DLINUX -c main.cpp -o main.o
|| main.cpp: In function ‘int main(int, char**)’:
main.cpp|14| error: no match for ‘operator==’ in ‘a == b’
matrix.cpp|147| note: candidates are: bool Matrix<T>::operator==(const Matrix<T>&) [with T = float]
|| In file included from matrix.h:81,
||                  from main.cpp:4:
|| matrix.cpp: In member function ‘void Matrix<T>::init(const T*) [with T = float*]’:
matrix.cpp|17| instantiated from ‘Matrix<T>::Matrix(index_t, index_t) [with T = float*]’
main.cpp|13| instantiated from here
matrix.cpp|34| error: invalid cast from type ‘double’ to type ‘float*’
|| make: *** [main.o] Fehler 1

Wenn ich versuche eine 3x3 Matrix mit einer 2x2 Matrix zu vergleichen habe ich ziemlich wahrscheinlich einen Fehler gemacht, auf den ich besser hingewiesen werde. Schließlich will man beim operator== normalerweise wissen ob die Elemente der Matrix gleich sind, nicht die Dimensionen. Es gibt also zwei verschiedene Vergleiche. Ob man die in einen Operator packen sollte?


Jetzt versch. Datentypen mit versch. Dimensionen in Verbindung zu bringen ist doch Haarspalterei… das hat einfach nichts miteinander zu tun.