【问题标题】:c++ eigenvalue and eigenvector corresponding to the smallest eigenvaluec++最小特征值对应的特征值和特征向量
【发布时间】:2014-06-07 19:32:34
【问题描述】:

我试图找出最小特征值对应的特征值和特征向量。我有一个矩阵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)吗?

附: - 当我打印时

mysolution.eigenvalues()[0]

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

mysolution.eigenvectors().col(0)

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

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    我猜你是对的。

    不过,您的特征值都不是空值。您似乎正在处理复数。

    可能是您选择了一个复杂的浮点矩阵来进行计算吗?类似于MatrixX2cfMatrixX2cd

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-11
        • 2019-04-16
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        相关资源
        最近更新 更多