我有 N 个列向量形式的特征值。这样就有N个特征向量对应这些特征值,形成一个特征向量矩阵。
现在,我正在处理的问题要求我按降序对特征值列向量进行排序。如何以与其特征值相同的顺序对特征向量矩阵进行排序以保持对应关系?
我有 N 个列向量形式的特征值。这样就有N个特征向量对应这些特征值,形成一个特征向量矩阵。
现在,我正在处理的问题要求我按降序对特征值列向量进行排序。如何以与其特征值相同的顺序对特征向量矩阵进行排序以保持对应关系?
例如,
m = RandomReal[{0, 1}, {5, 5}];
{evals, evecs} = Eigensystem[m];
SortBy[Transpose[{evals, evecs}], First]
或者如果您希望它们采用相同的形式,请将最后一行替换为
Transpose@SortBy[Transpose[{evals, evecs}], First]
编辑:虽然我用过{evals,evecs}=Eigensystem[m]
,但没必要。我本可以使用s=Eigensystem[m]
,然后s
在我目前拥有的任何地方使用{evals,evecs}
。
虽然@acl 和@yoda 的排序方式(即,将列表元素配对然后排序在一起)既简单又常用,但我想展示另一种通用方法,可以轻松地根据一个特定列表(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 *)
您可以使用该Sort
函数根据特征值对特征系统进行排序。
mat = (#*Transpose@#) &@RandomReal[NormalDistribution[], {4, 4}];
eigsys = Sort@Transpose@Eigensystem[mat];
Sort
的默认行为是按第一列排序。
使用数学:
matrix = RandomReal[{0, 1}, {4, 4}];
{evals, evecs} = Chop[Transpose[Sort[Transpose[Eigensystem[matrix]]]]];
输出:
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}}