Blatt 3, Aufgabe 1

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.

Blatt 3, Aufgabe 1
Hallo,
ich habe eine kurze Frage zur 1d). Soll man backSubstitute nur durchführen, wenn R quadratisch ist oder? Weil sonst hat man ja eventuell ein über/unterbestimmtes Gleichungssystem…


https://de.wikipedia.org/wiki/QR-Zerlegung#L.C3.B6sung_regul.C3.A4rer_oder_.C3.BCberbestimmter_Gleichungssysteme

In der Aufgabe ist von m ≥ n die Rede.


erledigt


n Abend,

ich kassiere folgenden Fehler:

Hm. Die Methode getColumnLower will mit unsigned int aufgerufen werden, und col ist doch ein unsigned int, ich verstehe nicht, was da schief geht…

Jemand ne Idee?

ergaenzt: Wenn ich mir vorher noch mal extra einen neuen unsigned int mache gehts auch schief.


Ich vermute mal, getColumnLower ist nicht als const deklariert und du rufst es als Member-Funktion eines als const deklarierten QRDecomposition-Objekts auf?
Also sowas wie:

const QRDecompostion qr;
//...
qr.getColumnLower(col);

Edit: Falls nicht klar war, was ich damit als Lösung vorschlage: Wenn du weißt, dass deine Implementierung von getColumnLower den Zustand des Objekts nicht verändert, was eine Getter-Funktion auch nicht tun sollte, solltest du das bei der Deklaration durch ein const angeben, also:

ColVector getColumnLower(unsigned int) const;

Spontane Antwort aus der Huefte geschossen: Ich soll doch die Methodendeklarationen nicht veraendern. Die Methoden die hier genannt sind sind alle vorgegeben.


Ohne jetzt mehr Code zu kennen und es auf den ersten Blick tatsächlich nach const vs. non-const aussieht, hast du ja vielleicht noch die Möglichkeit ein non-const Objekt zu übergeben. Sprich in der [m]getHouseholder()[/m] ein neues non-const [m]QRDecomposition[/m] anzulegen und darauf dann Dinge zu tun. Inwiefern das sinnvoll ist und ob du die Methode überhaupt brauchst, kann ich dir nicht sagen.


Fehler gefunden.
Dafuer hab ich jetzt ein neues Problem:
Es kompiliert, stuerzt dann aber mit folgender Meldung ab:

Das ist komisch, denn ich habe genau heraus gefunden, bei welcher Anweisung es in die Knie geht:
Wenn ich den Akzessor von m_system verwende. Das irritiert mich gerade, denn die Fehlermeldung bezieht sich ja auf vector.cpp, aber m_system ist ja ne Matrix.
Und diese scheint aus Vektoren zu bestehen, aber vom Typ std::vector und nicht von unserem Typ vector.cpp.

Hm.

ergaenzt: Es passiert uebrigens in getColumnLower, wenn ich den Vektor der zweiten Spalte zusammen stellen will, beim Zugriff auf das unterste Element.
Die Indizes sind aber eigentlich in Ordnung, hab ich schon getestet.


Für Diejenigen mit dem selben Problem könnte deine Lösung interessant sein.

vector.h included? Richtigen Namespace verwendet?


Erneut Fehler gefunden.
Beim alten Fehler war das Problem, dass ich in einer const-Methode eine nicht-const-Methode AUFGERUFEN habe.
An die Sache mit const muss ich mich halt noch gewoehnen.

Beim letzten Fehler lag es doch nicht an der Matrix, sondern ich hatte bei der Zuweisung in den Vektor einen falschen Index uebergeben.


Gut - jetzt laeuft das Ding schon mal.
Ich habe bei Q aber nur die erste Spalte richtig und bei R nur die erste Zeile.
Falls jemand schlau ist und weiss, was dann wohl mein Fehler sein koennte → immer her damit!

ergaenzt: Kommt das eventuell zu stande, wenn getHouseholder nur beim ersten Aufruf das richtige Ergebnis bringt und bei folgenden Aufrufen versagt?


Soll heißen? unverändert? oder einfach anders falsch?

Ich könnte mir vorstellen, dass du für die zweite Spalte/Zeile noch auf den alten Daten rechnest, was ja nicht mehr korrekt ist, wenn du Iterativ durchgehst.


Ne - nicht unveraendert. Anders falsch =)

ergaenzt: Es funktioniert jetzt.


Immer wenn es um allgemeine Fehler geht, die mit dem Problem zu tun haben und dem Anspruch genügen häufiger gemacht zu werden, dann gilt: