在 numpy.linalg (Python) 中使用 linalg.matrix_rank 的意外结果

Unexpected result using linalg.matrix_rank in numpy.linalg (Python)

我正在尝试计算大型 (182 x 182) 矩阵的秩。作为测试,我把

from numpy import linalg as LA

# Some other code ...

# R is a 182 x 182 matrix
det = LA.det(R)
print('|R|:')
print(det)            # Prints out 1.528938248893958e-29

tol = 10*det

rank = LA.matrix_rank(R, 10*det)

print('Rank of R:')
print(rank)           # Prints out 182!

因此计算 R 的行列式,将其乘以 10(因此它显然大于行列式)并将此值作为公差传递给 matrix_rank。但是,这打印出 182(矩阵的大小),我不明白。我期望 matrix_rank 给出的奇点数大于公差。由于整个矩阵的确定性(矩阵的奇异性)小于此,我希望得到小于 182.

任何人都可以为我阐明这一点吗?我做错了什么/误解了什么或者这是某种错误吗?

矩阵秩使用奇异值分解,如果你想确保你的矩阵被认为是不完整的秩,你的容忍度应该这样计算

_, s, _ = LA.svd(R)
tol = np.min(abs(s)) * 10;