对于小整数值矩阵的Matlab秩函数的“不一致”行为感到惊讶

时间:2017-01-11 15:22:46

标签: matlab rank

今天我对此感到非常惊讶:

>> M = [0, 0, 0;6, 1, 3;1, 7, 0];
>> rank(M)

ans = 

    3

>> rank(M')

ans = 

    2

我知道秩函数不一定在数值上是稳定的,因为它对奇异值进行阈值处理。然而,我期待大尺寸或大元素的矩阵发生问题,而不是3×3小整数矩阵。

我检查了发生了什么,实际上svd(M)给出奇异值7.82,5.93,2.91e-15,而默认容差只有max(大小(A))* eps(max(s))= 2.665e -15。另一方面,svd(M')给出0作为第三个奇异值(可能是由于整列为零)。

当然我可以手动增加呼叫等级的容忍度,但我怎么知道增加它的距离呢?

是否有另一种数值稳定的方法来计算排名(假设我们知道矩阵是整数)?

编辑:我刚发现此行为与版本有关。上述测试使用Matlab 2014a进行。在Matlab 2016b上,svd(M)返回第三个奇异值为4.15e-16并且排名正常。所以也许确实在版本之间修复了svd的问题。不过,我不确定我能相信多大程度,所以我相信我的问题仍然有效。

1 个答案:

答案 0 :(得分:1)

Matlab 2015a / 2015b似乎有效(见下文)

static_assert