Algorithm 检查矩阵是否奇异的快速方法?(不可逆,det=0) 什么是最快的算法(C或C++示例的链接将是酷的)来检查一个小的方阵(

Algorithm 检查矩阵是否奇异的快速方法?(不可逆,det=0) 什么是最快的算法(C或C++示例的链接将是酷的)来检查一个小的方阵(,algorithm,matrix,matrix-inverse,Algorithm,Matrix,Matrix Inverse,最快的方法可能是为你期望处理的每个大小矩阵硬编码一个行列式函数)。 这里有一些N=3的psuedo代码,但如果您检查行列式,则所有N的模式都应该是清晰的 function is_singular3(matrix) { det = matrix[1][1]*matrix[2][2]*matrix[3][3] - matrix[1][1]*matrix[2][3]*matrix[3][2] - matrix[1][2]*matrix[2][1]*matrix[

最快的方法可能是为你期望处理的每个大小矩阵硬编码一个行列式函数)。 这里有一些N=3的psuedo代码,但如果您检查行列式,则所有N的模式都应该是清晰的

function is_singular3(matrix) {
    det = matrix[1][1]*matrix[2][2]*matrix[3][3]
        - matrix[1][1]*matrix[2][3]*matrix[3][2]
        - matrix[1][2]*matrix[2][1]*matrix[3][3]
        + matrix[1][2]*matrix[2][3]*matrix[3][1]
        + matrix[1][3]*matrix[2][1]*matrix[3][2]
        - matrix[1][3]*matrix[2][2]*matrix[3][1];

     if(det==0) return true
     else return false
}

我同意高斯消去法。文档LU分解-从矩阵构造LU分解后,您可以调用其上的方法来获得行列式。我的猜测是,至少值得将其与任何更专业的方案进行比较。

最好的方法是计算via SVD并检查其是否大于1/ε,其中ε是机器精度


如果允许漏报(即矩阵有缺陷,但您的算法可能无法检测到),您可以使用Wikipedia文章中的max(a_ii)/min(a_ii)公式作为条件数的代理,但您必须首先计算QR分解(该公式适用于三角矩阵):a=QR,R正交,然后是cond(a)=cond(Q)。也有一些技术可以通过O(N)运算计算Q的条件数,但有更复杂的方法。

在R中,差异很小,但qr分解成功。请尝试以下方法:

    Sig <- matrix(rnorm(16),4,4)
    
    a <- Sys.time()
    for(j in 1:1000){
      out <- svd(Sig)
      cond <- any(out$d < 1e-10)
    }
    Sys.time()-a
    
    a <- Sys.time()
    for(j in 1:1000){
      out <- qr(Sig)
      cond <- out$rank < NROW(Sig)
    }
    Sys.time()-a

Sig可能是高斯消去法。不确定它是否最快,但SVD会告诉你。如果SVD发现的任何奇异值为0,那么你的矩阵是奇异的。@JustinPeel:LU分解在行列式方面会优于SVD,但SVD会给你更多信息:它会告诉你“哪个方向”对于矩阵来说是奇异的。无论如何,测试矩阵是否在数值上是奇异的最好方法是通过计算(其条件数的一个界)来执行,而不是通过计算行列式(这里的行列式是16线性的,所以小误差被提升到16次方),因此,如果速度不是一个严重的问题,SVD是可以的。我认为这是一种常见的堆栈溢出情况:下面是如何执行X-这真的是你想要做的吗?为什么你想找到行列式/如果矩阵是可逆的?你可能无论如何都希望SVD从矩阵不可逆或几乎不可逆的情况中恢复过来可逆。浮点矩阵需要从零开始进行ε距离检查。他需要一个元程序来生成硬代码公式。对于n=16,这可能会非常麻烦。对于n=15,莱布尼茨公式将有1.3万亿个求和。这不是一个现实的答案。-1,问题不是如何生成代码效果问题在于问题的一般时间复杂性。LU分解是计算行列式的标准方法。行列式不是测试矩阵缺陷的标准方法。使用LAPACK,我们可以对双精度/单精度通用矩阵使用DGECON/SGECON,或对具有可用str的矩阵使用类似例程结构(带状、对称等)。这使用LU分解