【发布时间】:2013-05-17 02:41:29
【问题描述】:
在 Matlab 中检查矩阵是否为对称正定矩阵的最快(运行时间)方法是什么?我已经对大量大小(维度)从 10000 到 100000 不等的稀疏矩阵运行了这个测试?
编辑:
对于我来说,Cholesky 的成本太高了。如果它表明矩阵可能是 spd,我需要先进行脏检查,然后我可能会使用 CHOL 更可靠地只检查那些矩阵
【问题讨论】:
标签: matlab linear-algebra
在 Matlab 中检查矩阵是否为对称正定矩阵的最快(运行时间)方法是什么?我已经对大量大小(维度)从 10000 到 100000 不等的稀疏矩阵运行了这个测试?
编辑:
对于我来说,Cholesky 的成本太高了。如果它表明矩阵可能是 spd,我需要先进行脏检查,然后我可能会使用 CHOL 更可靠地只检查那些矩阵
【问题讨论】:
标签: matlab linear-algebra
您可以通过使用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,而另一些则不是(玩弄 n、d 和 c),似乎表明它识别许多但不是全部的 SPD 矩阵(如预期的那样),但对于“大”n,与 eig()(及其底层 Cholesky)相比,非常便宜。对于您的特定矩阵,它可能有效,也可能无效。 YMMV,我猜。
显然,我还没有弄清楚所有细节,但我相信你明白了。
【讨论】:
关于上面提到的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。 基于这个反例,我怀疑跟踪测试不是决定性的。
【讨论】:
我认为要有效地做到这一点,这是一个不平凡的问题。如果矩阵不是正定矩阵,Cholesky 算法将失败,因此最好自己实现,这也有一个优势,即当算法失败时,由于输入不是正定矩阵,人们可以控制该怎么做。我使用 C# 而不是 Matlab 进行数学编程,而我的 Cholesky 实现只有几行代码,所以并不难。如果您使用其他人的算法,则取决于它的实现方式,如果您输入非对称矩阵,您可能会得到误导性结果,因为某些实现假设矩阵是对称的。我能想到的唯一快速预测试是检查the matrix trace,如果矩阵是 SPD,这将是肯定的。
【讨论】:
我想你可以看看你的矩阵的特征值,并检查它们是否都是不同的和实值的。
因此,您可能会认为调用eig 函数如下:
[V,D] = eig(A)
希望对你有帮助
【讨论】:
如here 所述,您可以使用chol 函数来检查矩阵是否为PD。
CHOL 函数提供可选的第二个输出参数“p” 如果发现矩阵是正定的,则为零。 CHOL 如果仅提供一个函数,则函数将返回错误 输出参数,并且还给出了一个不是正数的矩阵 定。注意:CHOL 期望其输入矩阵是对称的,并且只有 查看矩阵的上三角部分。
关于对称性,可以使用如下函数:
issym = @(m) isequal(tril(x), triu(x)');
【讨论】: