5
votes

I have N eigenvalues in column vector form. Thus there are N eigenvectors corresponding to these eigenvalues, forming an eigenvector matrix.

Now, the problem I am working on requires me to sort the eigenvalues column vector in descending order. How do I sort the eigenvectors matrix in the same order as their eigenvalues in order to preserve correspondence?

4
Note that when machine numbers are used in Mathematica, Eigensystem already returns the eigenvalues/vectors sorted in descending order.Szabolcs
Eigensystem will return eigenvalues and eigenvectors with the latter in order that corresponds to the former. Daniel LichtblauDaniel Lichtblau
I do want to point out one thing, for degenerate eigenvectors (i.e. same eigenvalue) of a numerical matrix, Eigenvectors and Eigensystem return vectors that are linearly independent, not orthogonal. This bit me more than once. But, you can use Orthogonalize on the degenerate set to give you an orthogonal set.rcollyer
@rcollyer, just checked and you are right! I didn't know this ...Szabolcs
@Szabolcs, yeah, nothing like relying on their orthogonality when they're not. And, you're right, you can use Orthogonalize on the whole set directly as it won't affect the orthogonality of the different subspaces.rcollyer

4 Answers

12
votes

For example,

m = RandomReal[{0, 1}, {5, 5}];
{evals, evecs} = Eigensystem[m];
SortBy[Transpose[{evals, evecs}], First]

or if you want them in the same form, replace the last line by

Transpose@SortBy[Transpose[{evals, evecs}], First]

EDIT: while I used {evals,evecs}=Eigensystem[m], that's not necessary. I could just have used s=Eigensystem[m] and then used s wherever I currently have {evals,evecs}.

9
votes

While @acl and @yoda's ways of sorting (i.e. pairing the list elements then sorting together) is easy and commonly used, I'd like to show another generic method to easily sort an arbitrary number of lists based on one particular list (list1):

oo = Ordering[list1]; (* this finds the sorting order of list1 *)
list1[[oo]]
list2[[oo]]
list3[[oo]]  (* these order some other lists in the same way *)
1
votes

You can use the Sort function to sort the eigensystem according to the eigenvalues.

mat = (#*Transpose@#) &@RandomReal[NormalDistribution[], {4, 4}];
eigsys = Sort@Transpose@Eigensystem[mat];

Sort's default behavior is to sort by the first column.

0
votes

Using Mathematica:

matrix = RandomReal[{0, 1}, {4, 4}];
{evals, evecs} = Chop[Transpose[Sort[Transpose[Eigensystem[matrix]]]]];

OutPut:

evals
{-0.296769, 0.187003, 0.52714, 2.00376}

evecs 
{{-0.412673,0.844056,-0.0718614,-0.334823}, 
{-0.370973,  -0.472126, 0.76248, 0.241042},
{-0.253163,  0.1719,  -0.786782, 0.536034},
{0.557741,  0.381364,  0.65039, 0.347102}}