eigenwert und eigenvektor einer größeren matrix (c++)
-
will doch nur auf dim2 testen obs auch richtig rechnet und dann die dim anheben. aber wenn er nichma dim 2 richtig kann dann brauch ich da nich weiter machen.
ob ich selber schreib oder einbinde is mir eigentlich wurst, allerdings muss ichs da erst ma verstehen wenn ichs selber code. also lieber einbinden^^will nur das das programm am ende endlich die eigenwerte ausspuckt, der eigenvektor sollte dann ya kein problem mehr sein.
danke daniel^^ ich glaub mein kopf is langsam zu matschig
ok habs jetzt so, kommt zumindest erstma kein fehler.
wo setz ich weiter an? wie gesagt mein englisch is echt mies#include <iostream> #include "tnt.h" #include "jama_eig.h" using namespace TNT; using namespace std; #define dim 2 int main() { int a,b,i,j; float matrix[dim][dim]; //eingabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cin>>matrix[a][b]; } } Array2D< double > A(dim,dim) ; /* create MxN array; all zeros */ for (i=0; i < dim; i++) for (j=0; j < dim; j++) A[i][j] = matrix[i][j]; //eigenwert //eigenvektor //ausgabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cout<<matrix[a][b]<<" "; } cout<<endl; } return 0; }
-
Um dann wirklich an die Eigenwerte anzukommen, mußt Du das etwa so machen:
JAMA::Eigenvalue <double> eigen_helfer(A); Array1D <double> eigenwerte_re (dim); // hier stehen dann die Realteile der Eigenwerte drin Array1D <double> eigenwerte_im (dim); // eigen_helfer.getRealEigenvalues (eigenwerte_re); eigen_helfer.getImagEigenvalues (eigenwerte_im); // der n-te Eigenwert ist also eigenwerte_re[n] + j eigenwerte_im[n]
An die Eigenvektoren kommst Du über eigen_helfer.getV(eigenvektormatrix), wobei Du die eigenvektormatrix natürlich auch erst mal anlegen mußt ...
-
so? weil ich bekomm 7 fehler in der jama_eig.h, das muss doch irgendwie gehn.
muss ich da noch nen using namespace jama_eig.h; machen?#include <iostream> #include "tnt.h" #include "jama_eig.h" using namespace TNT; using namespace std; #define dim 2 int main() { int a,b,i,j; float matrix[dim][dim]; //eingabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cin>>matrix[a][b]; } } Array2D< double > A(dim,dim) ; /* create MxN array; all zeros */ for (i=0; i < dim; i++) for (j=0; j < dim; j++) A[i][j] = matrix[i][j]; //eigenwert JAMA::Eigenvalue <double> eigen_helfer(A); Array1D <double> eigenwerte_re (dim); // hier stehen dann die Realteile der Eigenwerte drin Array1D <double> eigenwerte_im (dim); // eigen_helfer.getRealEigenvalues (eigenwerte_re); eigen_helfer.getImagEigenvalues (eigenwerte_im); //eigenvektor //ausgabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cout<<matrix[a][b]<<" "; } cout<<endl; } return 0; }
-
// Eigensolver Eigenvalue<double> solver(matrix); // Extract eigenvectors/values Array2D<double> solutionD; Array2D<double> solutionV; solver.getD(solutionD); solver.getV(solutionV);
danach enthält die Matrix solutionV in den Spalten die Eigenvektoren und in D stehen auf der Diagonalen die Eigenwerte (sofern die alle reell sind, sonst sieht's ein bißchen anders aus. Du kannst aber auch direkt auf die Eigenwerte mit eigenen get-Funktionen zugreifen.
"Ich bekomme 7 Fehler" ist nicht präzise genug um Dir helfen zu können. Poste doch bitte die Fehlermeldungen dazu.
-
Vielleicht in großen Teilen zu abgefahren für dein Problem, aber trotz allem interessant: http://www-users.cs.umn.edu/~saad/EIGBOOK.tar.gz
-
Hey, das Buch kann ich gerade ganz klasse gebrauchen. Danke für den Link!
-
hi leutz war gerade ne runde weg und werde morgen (^^bzw nachher) weitermachen, will es unbedingt haben. also allen erst ma einen schönen abend
-
hier nun mal die fehler die kommen , die 7 da:
main.cpp
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(154) : error C2374: 'j' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(148) : see declaration of 'j'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(165) : error C2374: 'j' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(148) : see declaration of 'j'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(170) : error C2374: 'j' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(148) : see declaration of 'j'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(173) : error C2374: 'j' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(148) : see declaration of 'j'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(188) : error C2374: 'i' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(116) : see declaration of 'i'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(201) : error C2374: 'k' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(198) : see declaration of 'k'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(210) : error C2374: 'j' : redefinition; multiple initialization
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(110) : see declaration of 'j'
d:\dokumente und einstellungen\windows95\desktop\neuer ordner (2)\neuer ordner (4)\neuer ordner\jama_eig.h(103) : while compiling class-template member function 'void __thiscall JAMA::Eigenvalue<double>::tred2(void)'
Error executing cl.exe.main.obj - 7 error(s), 0 warning(s)
-
so kommen die gleichen fehler.
#include <iostream> #include "tnt.h" #include "jama_eig.h" using namespace TNT; using namespace std; using namespace JAMA; #define dim 2 int main() { int a,b,i1,j1; float matrix[dim][dim]; //eingabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cin>>matrix[a][b]; } } Array2D< double > A(dim,dim) ; /* create MxN array; all zeros */ for (i1=0; i1 < dim; i1++) for (j1=0; j1 < dim; j1++) A[i1][j1] = matrix[i1][j1]; //eigenwert // Eigensolver Eigenvalue<double> solver(A); // Extract eigenvectors/values Array2D<double> solutionD; Array2D<double> solutionV; solver.getD(solutionD); solver.getV(solutionV); //eigenvektor //ausgabe matrix1 for(a=0;a<dim;a++) { for(b=0;b<dim;b++) { cout<<matrix[a][b]<<" "; } cout<<endl; } return 0; }
-
Kompilierst du unter VC++ 6? Wenn ja, dann musst du dem noch standardkonforme for-Schleifen beibringen. Das kannst du wenn ich mich recht entsinne mit einem einfachen define fixen:
#define for if(false); else for
Das sollte for-Schleifen in einen Scope einschließen und verhindern, dass die Zählervariable über die Schleife hinaus gültig bleibt, was beim 6er Compiler nicht ganz konform implementiert ist. Wenn das nicht hilft einfach mal suchen. Das Problem hatten schon andere vor dir. Beim VC >7 gibt es ein Compilerflag, was die Sache regelt.
-
ok hab jetzt g++ von suse genommen und schon sind die 7 fehler weg.
das prog startet und ich kann meine matrix eingeben.
wie lasse ich jetzt solutionV und solutionD ausgeben?
-
Genauso wie Du matrix ausgibst? Probier mal, vielleicht kannste die ja auch direkt mit cout << ... ausgeben.
-
yawoll
, scheenes ding jester
er rechnet sogar die komplexen eigenwerte, allerdings gibt er mir nur den realteil aus, kann man das noch irgendwo machen, dass er den im-teil noch ausspuckt?
dann wär echt perfekt.
-
Ja klar, die Imaginärteile stehen afaik neben den Realteilen in der Matrix. Oder halt mit der entsprechenden Abfragefunktion zugreifen.
-
Hallo
Warum versuchst Du es nicht einfach hier:
http://www.arndt-bruenner.de/mathe/scripts/eigenwert.htm
Die Homepage hält recht brauchbare Sachen bereit:
http://www.arndt-bruenner.de/mathe/mathekurse.htm
Grüße
Matthias