C++ 使用c++;特征库只计算一个特征向量

C++ 使用c++;特征库只计算一个特征向量,c++,eigen,eigenvector,C++,Eigen,Eigenvector,特征库的Selfadjointeigensolver()方法计算所有特征值的特征向量。我想让它只计算一个特定特征值的特征向量,例如最小值或最小值的第五个。这可能吗?如果您的矩阵是实矩阵,并且您已经在使用Eigen,那么最简单的方法就是使用,这是一个只需要Eigen的标题库。这是对旧Arpack的重新设计,它使用Arnoldi幂迭代迭代收敛到极值特征值/特征向量对。您可以一次请求“几个”特征对 如果你的矩阵很复杂,你有两个选择。你可以直接选择可以处理复杂矩阵但使用起来更繁琐的方法,或者你可以通过将

特征库的Selfadjointeigensolver()方法计算所有特征值的特征向量。我想让它只计算一个特定特征值的特征向量,例如最小值或最小值的第五个。这可能吗?

如果您的矩阵是实矩阵,并且您已经在使用Eigen,那么最简单的方法就是使用,这是一个只需要Eigen的标题库。这是对旧Arpack的重新设计,它使用Arnoldi幂迭代迭代收敛到极值特征值/特征向量对。您可以一次请求“几个”特征对

如果你的矩阵很复杂,你有两个选择。你可以直接选择可以处理复杂矩阵但使用起来更繁琐的方法,或者你可以通过将矩阵分成实部和虚部来坚持光谱,但这会带来很大的性能损失。本质上,如果你有一个复数
N*N
矩阵
a=B+iC
和向量
x=u+iv
,你将特征值方程
Ax=kx
转化为
(B+iC)(u+iv)=k(u+iv)
,这可以写成
2N*2N
问题


如果你的矩阵真的很大,你可能需要考虑。

一般来说,如果我没有记错的话,找到第n个特征向量与矩阵的对角线一样昂贵。例外情况是最小或最大特征值,可以使用移位逆迭代。然而,我不知道在特征值中有一个实现。你可以计算所有的特征值,然后手动计算一个特定特征值的特征向量。或者对于大型稀疏矩阵,您可以查看
ArpackSupport
模块(不知道该模块目前有多稳定,它看起来完全没有文档记录,因此您需要检查API)@chtz我如何根据该特征值计算特征向量,对于大型矩阵,您需要计算
a-lambda*Identity
的内核,例如,使用
FullPivLU
。不确定你是否真的从中得到了什么(这就是为什么我不把它作为一个答案)。