【问题标题】:Checking whether a matrix is SPD检查矩阵是否为 SPD
【发布时间】:2013-05-17 02:41:29
【问题描述】:

在 Matlab 中检查矩阵是否为对称正定矩阵的最快(运行时间)方法是什么?我已经对大量大小(维度)从 10000 到 100000 不等的稀疏矩阵运行了这个测试?

编辑:

对于我来说,Cholesky 的成本太高了。如果它表明矩阵可能是 spd,我需要先进行脏检查,然后我可能会使用 CHOL 更可靠地只检查那些矩阵

【问题讨论】:

    标签: matlab linear-algebra


    【解决方案1】:

    您可以通过使用Gershgorin's Theorem(用于估计特征值)从考虑中排除一些矩阵来稍微精简该字段。

    结果是,如果将每一行(对角线除外)元素的绝对值相加,k,你会得到一个半径,r k。对应的特征值必须位于对角线值的半径范围内,akk。所以,如果 akk > rk 对于所有 k,你的矩阵就是 PD。如果 akkk 对于某些 k,您的矩阵可能仍然是 PD,因为所有这些意味着一个或多个 Gershgorin 圆盘横跨虚轴(或零),实际特征值可能在任一侧。

    假设issymmetric(A) 成功,类似于:

    r = sum(abs(A),2)-diag(A);
    if length(find(r>diag(A))) == 0,
        % No circles cross the origin: A is PD
    else
        % A might still be PD: do some other test
    end
    

    使用矩阵M=sprandsym(n,n,d)+c*speye(n,n) 对此进行快速'n'dirty 测试,其中一些是 PD,而另一些则不是(玩弄 ndc),似乎表明它识别许多但不是全部的 SPD 矩阵(如预期的那样),但对于“大”n,与 eig()(及其底层 Cholesky)相比,非常便宜。对于您的特定矩阵,它可能有效,也可能无效。 YMMV,我猜。

    显然,我还没有弄清楚所有细节,但我相信你明白了。

    【讨论】:

      【解决方案2】:

      关于上面提到的trace测试: 假设矩阵 A 为:

      A =
          1.0000    1.6000
          1.6000    1.0000
      

      然后

      trace(A) is 2 
      

      但是A的特征值是eig(A)

      ans =
         -0.6000
          2.6000
      

      因此特征值并不都是正的。 因此,该矩阵不是 SPD,但其迹线 > 0。 基于这个反例,我怀疑跟踪测试不是决定性的。

      【讨论】:

        【解决方案3】:

        我认为要有效地做到这一点,这是一个不平凡的问题。如果矩阵不是正定矩阵,Cholesky 算法将失败,因此最好自己实现,这也有一个优势,即当算法失败时,由于输入不是正定矩阵,人们可以控制该怎么做。我使用 C# 而不是 Matlab 进行数学编程,而我的 Cholesky 实现只有几行代码,所以并不难。如果您使用其他人的算法,则取决于它的实现方式,如果您输入非对称矩阵,您可能会得到误导性结果,因为某些实现假设矩阵是对称的。我能想到的唯一快速预测试是检查the matrix trace,如果矩阵是 SPD,这将是肯定的。

        【讨论】:

          【解决方案4】:

          我想你可以看看你的矩阵的特征值,并检查它们是否都是不同的和实值的。

          因此,您可能会认为调用eig 函数如下:

          [V,D] = eig(A)
          

          希望对你有帮助

          【讨论】:

            【解决方案5】:

            here 所述,您可以使用chol 函数来检查矩阵是否为PD。

            CHOL 函数提供可选的第二个输出参数“p” 如果发现矩阵是正定的,则​​为零。 CHOL 如果仅提供一个函数,则函数将返回错误 输出参数,并且还给出了一个不是正数的矩阵 定。注意:CHOL 期望其输入矩阵是对称的,并且只有 查看矩阵的上三角部分。

            关于对称性,可以使用如下函数:

            issym = @(m) isequal(tril(x), triu(x)');
            

            【讨论】:

            • cholesky 对于我的目的来说成本过高。如果它表明矩阵可能是 spd,我需要先进行脏检查,然后我可能会使用 CHOL 更可靠地只检查那些矩阵
            • 如果你想要一个初步的、肮脏的测试,直接使用正定性标准:检查 v'Av 是否有几个向量 v 使得计算非常快速地。对于某些向量,这相当于检查矩阵中的单个元素。
            猜你喜欢
            • 2022-01-15
            • 1970-01-01
            • 2012-11-03
            • 1970-01-01
            • 1970-01-01
            • 2016-06-28
            • 2019-03-09
            • 2013-05-28
            • 2015-09-19
            相关资源
            最近更新 更多