|Re: [eigen] ordering of eigenvalues of EigenSolver|
[ Thread Index |
| More lists.tuxfamily.org/eigen Archives
I am interested in your answer to Susanne question, but I think you
didn't fully address it.
Her question wasn't about ascending versus descending ordering, but was
about the basis for the sort. Is it (and should it be) the eingenvalues
directly, or the absolute values of the eigenvalues ?
Le 18/02/2011 16:59, Benoit Jacob a écrit :
> Sorry for the belated answer, I hadn't actually checked carefully what
> both Eigen and others (LAPACK) were doing until today.
> As it turns out, we are doing exactly the same thing as LAPACK:
> * for self-adjoint eigensolver, we sort eigenvalues in ascending
> order. For LAPACK, see:
> * for SVD, we sort singular values in descending order. For SVD, see:
> I agree that it's pretty weird to be using sometimes ascending and
> sometimes descending order. But since that's what both LAPACK and
> ourselves have been doing, we shouldn't change that now.
> 2011/2/8 Susanne Suter <susanne.suter@xxxxxxxxx>:
>> Sorry, I accidently hit the "send button" too early. Here my complete
>> messge again.
>> I'm testing the Eigen library in order to use it for eigenvalue
>> decomposition or SVD. In the end I need the eigenvectors (left
>> singular vectors) and the eigenvalues (singular values).
>> I noticed that when using the EigenSolver classes, the ordering of the
>> eigenvalues is not as I expected. Normally, I would expect that I get
>> an ordering analogous to the singular values, i.e., an ordering with
>> the maximum absolute value first and then decreasing values ordered by
>> their absolute value (sometimes also called "largest magnitude
>> eigenvalues"). What I get now, looks a bit like an ordering
>> considering the sign (SelfAdjointEigenSolver). I had similar issues
>> with EigenSolver and ComplexEigenSolver (however, I found the ordering
>> not consistent in all methods).
>> ### SelfAdjointEigenSolver: eigenvalues of A are: -2.77687
>> -1.50582 -0.0370092 0.848378
>> ### ComplexEigenSolver: eigenvalues are: (-0.0370093,0) (0.848378,0)
>> (-1.50582,0) (-2.77687,0)
>> ### EigenSolver: eigenvalues are : (-2.77687,0) (-0.0370092,0)
>> (0.848379,0) (-1.50582,0)
>> However, I would expect
>> ### eigenvalues of A are: -2.77687 -1.50582 0.848378 -0.0370092
>> Until now, I only was using eigenvalue decompositions, which used the
>> same ordering for eigenvalues as the SVD for the singular values (e.g.
>> Matlab). Is there any reason why the implementation of Eigen is
>> different? Or is there any option to change the ordering?
>> I'm using the following test matrix:
>> A =
>> -2.0000 -0.6714 0.8698 0.5792
>> -0.6714 -1.1242 -0.0365 -0.5731
>> 0.8698 -0.0365 -0.4660 -0.8542
>> 0.5792 -0.5731 -0.8542 0.1188
>> and I test it with the following code (using the Eigen3 version).
>> Eigen::SelfAdjointEigenSolver<Eigen::Matrix4f> es;
>> std::cout << "### SELFADJOINT EIGENVALUE DECOMPOSITION ### " << std::endl;
>> std::cout << "** eigenvalues of A are: " <<
>> es.eigenvalues().transpose() << std::endl;
>> std::cout << "** eigenvectors of A are: " << std::endl <<
>> es.eigenvectors() << std::endl;
>> Thank you for any hints or advice on that topic.