Rechnen mit Matrizen in C++
-
Hallihallo
ich muss bei einem Ferialjob C++ programmieren und ein Programm schreiben, das Ausgleichskurven in Form von Polynomen verschiedenen Grades berechnen soll. Wie auch immer, ich muss mit Matrizen rechnen und hab dazu Matrix TCL eingebunden und versuche damit vergeblich einfach mal eine Matrix zu initialisieren. Mein Code:
// Ausgleichspolynom berechnen int grad = 1; int row; int col; dMatrix A(21, 1); size_t a=0, b=0; A[a][b] = 1; for(row = 0; row < nPoints; row++) { for(col = 0; col < grad; col++){ m_var_output.AppendFormat("A[0][0] = %f\r\n", A(a, col)); UpdateData(false); A[row][col] = u[row]; m_var_output.AppendFormat("u = %g\r\n", u[row]); UpdateData(false); m_var_output.AppendFormat("A[0][0] = %g\r\n", A(row, col)); UpdateData(false); //A(row, col) = pow(x[row], row); } }Ihr seht ich hab schon unzählige Kontrollausgaben. Ja, u ist ein gefülltes Array und ich hab so blöde Outputs weil das in ein Fenster der MFC-Bibliothek geht. Die Matrix ist mit völlig sinnfreien Werten irgendwo bei 10^-16 gefüllt, egal was ich mache. Ich arbeite auf VB 2005, Output in Datei ergibt gleiches Ergebnis - ich glaub ihr habt alle relevanten Infos.

Kann mir wer helfen? Im Notfall auch eine bessere Bib empfehlen? (Eigen hätte ich schon geladen, allerdings ist die Einbindung der unzähligen Dateien zu Aufwändig - ich muss was möglichst kleines einbinden)
Danke!
-
Gib bei Fehlern die sich zur Laufzeit äußern bitte ein vollständiges Beispielprogramm mit erwarteter Ausgabe und tatsächlicher Ausgabe an. Siehe dritter Link in meiner Signatur.
Kann mir wer helfen? Im Notfall auch eine bessere Bib empfehlen?
Matrix TCL ist schon ganz ok. Eigen ist auch ziemlich gut aber für deine Zwecke möglicherweise Overkill.
-
tja, ich habs jetzt mit müh und not geschafft, ein minimalbeispiel zu erstellen, dass ohne datenreihe auslesen und co auskommt - und es läuft einwandfrei
ich dachte es muss daran liegen dass ich bei der initalisierung der matrizen blödsinn mache oder so.das heißt leider, dass ich jetzt keine ahnung hab, wo ich den fehler suchen muss und nachdem das projekt rundherum zu groß/kompliziert ist zum posten, ist der beitrag wohl hinfällig...
sorry, fürs unnötige posting! aber das war meine letzte hoffnung nach knapp 7 stunden googlen und ausprobieren...
-
Dann guck doch mal, ab wann der Fehler auftritt und wann nicht. Dann hast du mit hoher Wahrscheinlichkeit die Fehlerstelle gefunden.
-
es kommt kein fehler - er schreibt einfach nicht in die matrix, die matrix enthält immer die gleichen werte (standardwerte oder so, die sie auch beim minimalbeispiel direkt nach der definition hat). ich hab den code eins zu eins übernommen und nur u und nPoints statt ausgelesenene messwerten einfach so definiert. es ist alles gleich, nur dass plötzlich für A(row, col) keine werte mehr raus kommen sondern immer die gleiche zahl irgendwas*e^-66 oder so raus kommt....
eingebundene header sind gleich (bzw. halt mehr als beim minimalbeispiel), eingabe ist gleich bis auf die verwendeten daten codeausschnitt ist gleich - bäm! anderes ergebnis - absolut nicht logisch und beim programmieren nicht möglich, ich weiß, dass irgendwas anders sein muss ^^ aber ich hab keine idee mehr was. dafür hab ich leider in c++ zu wenig erfahrung...
-
Ich kenn die Library nicht, aber ich hab da so ein Gefühl: Versuch's mal mit
A(row, col)stattA[row][col]...
-
Ausgeschlafenerweise hab ich mein Minimalbeispiel heute nochmal mit ähnlichen Werten gefüttert wie meinen eigentlichen Vektor und festgestellt, dass die Matrix keine Kommazahlen übernimmt. Double-Werte funktionieren an sich schon, aber nur wenn es ganze Zahlen sind...
@dot: das wär auch mein erster Versuch gewesen, aber der Code an sich stimmt schon...
hier an sich also mein kleines Code-Bsp:
#include "stdafx.h" #include <iostream> #include <cmatrix> using namespace std; typedef techsoft::matrix<float> fMatrix; typedef techsoft::matrix<double> dMatrix; int _tmain(int argc, _TCHAR* argv[]) { // Ausgleichspolynom berechnen int grad = 1; int row; int col; int nPoints = 10; double *u; u = new double[nPoints]; int i; for(i = 0; i < nPoints; i++){ u[i] = i /15; cout << u[i] << endl; } dMatrix A(21, 1); for(row = 0; row < nPoints; row++) { for(col = 0; col < grad; col++){ cout << "A(" << row << "," << col << ") = " << A(row, col) << endl; A[row][col] = u[row]; cout << "u = " << u[row] << endl; cout << "A(" << row << "," << col << ") = " << A(row, col) << endl; } } cout << "A(9,0) = " << A(9,0) << endl; return 0; }Wer kann mir sagen warum mir das Ding keine Kommazahlen übernimmt??
(Dokumentation zur Lib: http://www.techsoftpl.com/matrix/doc/manual.htm)
-
was ist wohl das Ergebnis von i/15 wenn sowohl i als auch 15 Ganzzahlen sind?
-
Ich empfehle http://www.robertnz.net/nm11.htm (Newmat). Lass dich von der Seite nicht täuschen. Newmat wird in vielen Projekten verwendet, ich selbst habe es auch in vielen großen Projekten verwendet, auch da, wo es auf Geschwindigkeit ankam.
Die Lib ist einfach zu benutzen, klein, schnell und bietet eine ausreichende Funktionalität und Doku. Damit kannst du quasi fast Matlab 1 zu 1 nach C++ portieren.
-
spitzenmäßig!! @helfendehand, danke für den tipp, werd ich ausprobieren!! genau so was hätt ich gesucht, bin aber auf google absolut nicht fündig geworden...
zur info für alle andren: die matrizen werden ordnungsgemäß initalisiert, können aber nicht via fprintf ausgegeben werden. ich hab das problem zwischenzeitlich so gelöst, dass ich die matrix, die ja dann im ergebnis nur noch der vektor mit den polynomkoeffizienten ist einfach auf ein array übergebe und das dann ausgebe - unschön, funktioniert aber.
