对小整数值矩阵上的 Matlab 秩函数的“不一致”行为感到惊讶
Posted
技术标签:
【中文标题】对小整数值矩阵上的 Matlab 秩函数的“不一致”行为感到惊讶【英文标题】:Surprised by "inconsistent" behaviour of Matlab's rank function on small, integer-valued matrices 【发布时间】:2017-05-26 11:08:49 【问题描述】:今天我对此感到非常惊讶:
>> M = [0, 0, 0;6, 1, 3;1, 7, 0];
>> rank(M)
ans =
3
>> rank(M')
ans =
2
我知道秩函数不一定在数值上是稳定的,因为它会阈值奇异值。然而,我预计矩阵大小或元素都很大而不是 3 x 3 小整数矩阵会发生问题。
我检查了会发生什么,实际上 svd(M) 给出了奇异值 7.82、5.93、2.91e-15,而默认容差仅为 max(size(A))*eps(max(s)) = 2.665e -15。另一方面,svd(M') 给出 0 作为第三个奇异值(可能是由于整列为零)。
当然我可以手动增加调用等级的容差,但是我怎么知道增加多少呢?
是否有另一种数值稳定的方法来计算秩(假设我们知道矩阵是整数)?
edit:我刚刚发现这种行为与版本有关。上述测试是使用 Matlab 2014a 进行的。在 Matlab 2016b 上,svd(M) 返回第三个奇异值 4.15e-16 并且 rank 正常工作。所以也许确实存在版本之间修复的 svd 问题。尽管如此,我仍然不确定我能在多大程度上信任 rank,所以我相信我的问题仍然有效。
【问题讨论】:
与您在 2014b 中的效果相同,记录在案。 在 R2016b 上,cond(M)
提供 5.046e15
和 cond(M.')
提供 inf
。 rank(M)
和 rank(M.')
都给 2
在我的计算机上,cond(M) 在 R2016b 中给出 1.884e16,在 R2014a 中给出 2.69e15。所以除了版本之外,它可能是平台相关的。太好了。
【参考方案1】:
Matlab 2015a/2015b 似乎可以工作(见下文)
>> M = [0, 0, 0;6, 1, 3;1, 7, 0];
>> rank(M)
ans =
2
>> rank(M')
ans =
2
>>
【讨论】:
谢谢,所以根据数据,这个问题在 2014b 和 2015a 之间得到了修复。以上是关于对小整数值矩阵上的 Matlab 秩函数的“不一致”行为感到惊讶的主要内容,如果未能解决你的问题,请参考以下文章
图像去噪基于matlab稀疏表示KSVD图像去噪含Matlab源码 2016期
基于matlab的低秩结构重构算法仿真实现,对比ALM,IT,APG,ADMM
[Matlab]协方差矩阵计算使用cov函数的结果与自编程序结果存在不一致