你如何在Eigen中找到条件数?

时间:2015-11-06 20:49:38

标签: math eigen

在Matlab中有condrcond,也有LAPACK。在Eigen中有任何例程可以找到矩阵的条件数吗?

我有一个矩阵的Cholesky分解,我想检查它是否接近奇点,但在文档中找不到类似的函数。

更新 我想我可以使用类似this algorithm的东西,它使用三角分解。 Ilya的方法对于更准确的答案很有用,所以我会将其标记为正确。

3 个答案:

答案 0 :(得分:5)

计算条件数的最简单方法是使用表达式:

cond(A) = max(sigma) / min(sigma)

其中sigma是一个奇异值数组,是SVD的结果。特进作者suggests此代码:

JacobiSVD<MatrixXd> svd(A);
double cond = svd.singularValues()(0) 
    / svd.singularValues()(svd.singularValues().size()-1);

其他方式(效率较低)

cond(A) = max(lambda) / min(lambda)
cond(A) = norm2(A) * norm2(A^-1)

其中lambda是一个特征值数组。

看起来Cholesky分解在这里没有直接帮助,但我现在无法确定。

答案 1 :(得分:1)

您可以使用Gershgorin circle theorem进行粗略估算。

但正如Ilya Popov已经指出的那样,计算特征值/奇异值更可靠。然而,计算所有特征值是没有意义的,这非常昂贵。您只需要最大和最小的特征值,因为您可以使用Power method作为最大特征值,Inverse Iteration作为最小特征值。

或者您可以使用可以执行此操作的库,例如Spectra

答案 2 :(得分:0)

您可以使用规范。以我的机器人经验,这在计算上比奇异值要快:

pseudoInverse(matrix).norm() * matrix.norm()

我发现它比6x6矩阵的奇异值快2.6倍。本书中也建议这样做:

B. Siciliano, and O. Khatib, Springer Handbook of Robotics. Berlin: Springer Science and Business Media, 2008, p. 236.