在 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;
我正在尝试计算大型 (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;