今天我对此感到非常惊讶:
>> 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的问题。不过,我不确定我能相信多大程度,所以我相信我的问题仍然有效。
答案 0 :(得分:1)
Matlab 2015a / 2015b似乎有效(见下文)
static_assert