对小整数值矩阵上的 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.046e15cond(M.') 提供 infrank(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报错矩阵维度不一致如何解决?

[Matlab]协方差矩阵计算使用cov函数的结果与自编程序结果存在不一致

MATLAB求下列矩阵的对角线元素 上三角阵 下三角阵 秩 范数 条件数 迹

matlab中的ranksum函数(秩和检验)怎么调用?