Re: [eigen] ordering of eigenvalues of EigenSolver |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] ordering of eigenvalues of EigenSolver
- From: Susanne Suter <susanne.suter@xxxxxxxxx>
- Date: Mon, 21 Feb 2011 15:34:21 +0100
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type:content-transfer-encoding; bh=+FoOcBPzGA9vyd8CacdUT4X0ze17PvEDyIf59Ba0iSU=; b=ON0MqfhBSZTFXEB5mj6g5rdWg/O3ICEMN9dANItu74Z5RoGLuUNHl6Y5O3kKKcxpa/ 2WQeq3I5OJr4xlRF5rBAn5TvZGOrii+R2q3dg+x18yxu0pujLNFes/2FRXxssWzhNMXV FZbld4tCld7KgWDAK4kfuREhfGO/tiXsPIhdc=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=q8mCx1BMA57h52IP4a9PQPkh6ZMSCn/s79XDcuJ1FilzfOdcaTKttL6lCRS4DXj2Mn 0kKEjp4sqcJ4yow7gCLU6pLpXcm45FpUdXpLGBcVLUw1vhv4kxFQRZbTVt/RPr5zT/dy F0BP9ofSIxa9HBSLumEqUSFKch/6ykPvXj3GY=
I forgot to say, I'm only talking about real value problems
On Mon, Feb 21, 2011 at 3:12 PM, Susanne Suter <susanne.suter@xxxxxxxxx> wrote:
> Hi
>
> Thanks Robert for pointing out my question, which was about sorting
> according to absolute value or signed value. Because in the current
> implementation the eigenvalues are ordered taking into account the
> sign (my example: -2.77687, -1.50582, -0.0370092, 0.848378 (last two
> values should be switched or if ascending order, the whole ordering
> should be reversed).
>
> I'm actually using LAPACK SVD now, but I was considering to use eigen
> library for SVD and/or Eigenvalue decomposition. So, I'm verifying if
> eigen produces the results I expect.
>
> I think we should draw a differentiation between SVD and eigenvalue
> decomposition:
>
> For SVD, the solution is unique except for the sign and the singular
> values are always ordered descending. I.e., the singular values are
> ordered according to their absolute value.
>
> To my understanding, for eigenvalue decomposition the values don't
> necessarily have to be ordered. But I can only think of applications,
> which use them ordered and when ordering them, I would use it
> according to absolute value (for real value problems). I.e., use the x
> largest magnitude values.
>
> Furthermore, other eigenvalue decomposition libraries seem to order
> eigenvalues, too. E.g., MatLab (based on ARPACK) orders the eigenvalue
> according to absolute value and it seems that LAPACK SSYEV does the
> same but in reverse order.
>
> So, is there a bug in the eigen library or are the values intended to
> be sorted like that (according to weight and direction/sign)?
>
> Thank you and best,
> Susanne
>
> On Mon, Feb 21, 2011 at 10:20 AM, Robert Bocquier
> <robert.bocquier@xxxxxxxxxxx> wrote:
>> Hi Benoit,
>>
>> 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 ?
>>
>> Thx
>> Robert
>>
>> Le 18/02/2011 16:59, Benoit Jacob a écrit :
>>> Hi,
>>>
>>> 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:
>>> http://www.netlib.org/lapack/single/ssyev.f
>>>
>>> * for SVD, we sort singular values in descending order. For SVD, see:
>>> http://www.netlib.org/lapack/single/sgesvd.f
>>>
>>> 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.
>>>
>>> Benoit
>>>
>>> 2011/2/8 Susanne Suter <susanne.suter@xxxxxxxxx>:
>>>> Hi
>>>>
>>>> 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;
>>>> es.compute(A);
>>>> 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.
>>>>
>>>> Best,
>>>> Susanne
>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>>
>>
>