c ++特征值和特征向量对应于最小特征值

时间:2014-06-07 19:32:34

标签: c++ eigen

我试图找出对应于最小特征值的特征值和特征向量。我有一个矩阵A(nx2),我计算了B = transpose(A) * a。当我使用c ++本征函数compute()并打印矩阵B的特征值时,它显示如下:

(4.4, 0)
(72.1, 0)

打印输出的特征向量:

(-0.97, 0)   (0.209, 0)
(-0.209, 0)  (-0.97, 0)

我很困惑。我想,特征向量不能为零。那么,对于最小的特征值4.4,是相应的特征向量(-0.97, -0.209)

P.S。 - 我打印时

mysolution.eigenvalues()[0]

打印(4.4, 0)。当我打印

mysolution.eigenvectors().col(0)

打印(-0.97, 0) (0.209, 0)。这就是为什么我猜我可以假设对于特征值4.4,相应的特征向量是(-0.97, -0.209)

2 个答案:

答案 0 :(得分:0)

我猜你是对的。

但是,没有一个特征值为空。您似乎正在处理复杂的数字。

是否可以选择复杂的浮点矩阵来进行计算?类似于MatrixX2cfMatrixX2cd

的内容

答案 1 :(得分:0)

每个方阵都有一组特征值。但即使矩阵本身只包含实数,特征值和-vectors也可能包含复数(例如,取(0 1; -1 0))

如果Eigen对你的矩阵结构一无所知(即它是对称/自伴的吗?它是正交/单一吗?)但仍想为你提供精确的特征值,唯一可以容纳所有可能的特征值的一般类型是复数。

因此,Eigen总是返回复数,其表示为a + bi的对(a,b)。如果矩阵是自伴的,则Eigen将仅返回实数,即SelfAdjointView用于访问矩阵。

如果你知道你的矩阵只有真正的特征值,那么你可以通过eigenvalue.real提取实部,因为Eigen返回std::complex值。

编辑:我刚刚意识到如果你的矩阵A没有复杂的条目,B =转置(A)* A是自伴的,因此你可以使用矩阵的SelfAdjointView来计算真实的特征值和-vectors。