擅长:python、mysql、java
<p>如果矩阵是可逆的,则辅因子与逆矩阵相关:</p>
<pre><code>def matrix_cofactor(matrix):
return np.linalg.inv(matrix).T * np.linalg.det(matrix)
</code></pre>
<p>这会产生较大的加速(50x50矩阵约为1000x)。主要原因是基本的:这是一个<code>O(n^3)</code>算法,而次要的基于det的算法是<code>O(n^5)</code>。</p>
<p>这可能意味着,对于不可逆矩阵,有一些聪明的方法来计算辅因子(即,不使用上面使用的数学公式,而是使用其他等价定义)。</p>
<hr/>
<p>如果您坚持使用基于det的方法,您可以执行以下操作:</p>
<p>大部分时间似乎都花在了<code>det</code>里面。(请查看<a href="http://packages.python.org/line_profiler/" rel="noreferrer">line_profiler</a>自己找到答案。)您可以尝试通过将Numpy与Intel MKL链接来加速这一部分,但除此之外,没有什么可以做的。</p>
<p>你可以这样加速代码的另一部分:</p>
<pre><code>minor = np.zeros([nrows-1, ncols-1])
for row in xrange(nrows):
for col in xrange(ncols):
minor[:row,:col] = matrix[:row,:col]
minor[row:,:col] = matrix[row+1:,:col]
minor[:row,col:] = matrix[:row,col+1:]
minor[row:,col:] = matrix[row+1:,col+1:]
...
</code></pre>
<p>根据矩阵的大小,这将获得大约10-50%的总运行时间。原始代码有Python<code>range</code>和列表操作,这比直接切片索引慢。你也可以试着更聪明一些,只复制那些实际改变的小部分——然而,在上述改变之后,几乎100%的时间都花在了<code>numpy.linalg.det</code>里面,所以对其他部分的进一步优化就没有那么多意义了。</p>