今天我对此感到非常惊讶:
>> 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的问题.不过,我不确定我能在多大程度上信任等级,所以我相信我的问题仍然有效.