如何在 Eigen 中找到条件编号?

How can you find the condition number in Eigen?

在 Matlab 中有 condrcond,在 LAPACK 中也有。 Eigen中有没有找矩阵条件数的套路?

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

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

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

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 分解似乎在这里没有直接帮助,但我现在不能确定。

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

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

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

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

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.