目前我正在使用下面的代码来获取删除第 i 行和第 j 列的子矩阵,但是在分析我的代码之后,它似乎是我代码中的主要瓶颈之一。有没有更有效的方法?
def submatrix(A, i, j):
logger.debug('submatrix(%r, %r, %r)', A, i, j)
B = empty(shape=tuple(x - 1 for x in A.shape), dtype=int)
B[:i, :j] = A[:i, :j]
B[i:, :j] = A[i+1:, :j]
B[:i, j:] = A[:i, j+1:]
B[i:, j:] = A[i+1:, j+1:]
return B
25015049 function calls (24599369 primitive calls) in 44.587 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
3983040 15.541 0.000 20.719 0.000 defmatrix.py:301(__getitem__)
415680 10.216 0.000 33.069 0.000 hill.py:127(submatrix)
415686/6 3.232 0.000 44.578 7.430 hill.py:112(det)
编辑:Jaime 提供了一种使用正则逆和行列式来近似模逆的好方法,但是对于大基数(在我的情况下为模 256),不准确性足以使整个事情变得毫无意义。主要时间接收器似乎实际上是numpy中的 getitem ,但我相信这是由以下几行引起的:
B[:i, :j] = A[:i, :j]
B[i:, :j] = A[i+1:, :j]
B[:i, j:] = A[:i, j+1:]
B[i:, j:] = A[i+1:, j+1:]
瓶颈可能不是在内存中复制矩阵,而是矩阵条目访问。