On 11/11/2013 11:40 AM, andrea antonello wrote: > Hi Thomas, > thanks for your reply. > >> the result of CM and jama are identical, the difference is just in the >> way how the data is stored. >> >> Afaik in jama calling getV() returns a vector in row format whereas in >> CM the are stored in column format. >> >> If you transpose the matrix (or call getVT()) you will see that the >> vectors are identical, except for the signs and order. The reason for >> this is that for CM the eigenvalues/eigenvectors are sorted in >> descending order in case of a symmetric matrix, which is the case for >> your matrix. > > the problems is that the result is not just different in the > transposed way. And in fact if I pick the getVT,results are still not > the same. > The result seems to be reflected on the secondary diagonal, not the > primary diagonal. > > Furthermore, if I use the API, I do not expect to be problems of rows > and columns, so if I use: > > double eigenValue = eigenDecomposition.getRealEigenvalue(i); > RealVector eigenVector = eigenDecomposition.getEigenvector(i); > > I expect the eigenvector and eigenvalue to be the right ones for the > given index, no matter how the results are given in the matrixes. > > But the results I get are, for the same eigenvalue: > CM: eigenVal: 0.8056498828134406, eigenVect: [0.9015723557614027, > 0.19005937823202243, 0.38864472217295326 > JAMA: eigenVal: 0.8056498828134406, eigenVect: [-0.7731388420716028, > 0.5012101463530931, -0.38864472217295326] > > I am still quite puzzled about what I am missing.
I do not know how you get the eigenvector from jama, as there is no getEigenVector method. The class javadoc of their EigenvalueDecomposition states: columns of V represent the eigenvectors in the sense that A*V = V*D, i.e. A.times(V) equals V.times(D). The matrix V may be badly conditioned, or even singular, so the validity of the equation A = V*D*inverse(V) depends upon V.cond(). Looking at your example it looks like you took the rows of V to extract your eigenvector. You can also easily verify if your eigenvector is correct: A * v = lambda * v Thomas --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org