在Matlab中有cond
和rcond
,也有LAPACK。在Eigen中有任何例程可以找到矩阵的条件数吗?
我有一个矩阵的Cholesky分解,我想检查它是否接近奇点,但在文档中找不到类似的函数。
更新 我想我可以使用类似this algorithm的东西,它使用三角分解。 Ilya的方法对于更准确的答案很有用,所以我会将其标记为正确。
答案 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倍。本书中也建议这样做: