我正在尝试将以下MATLAB代码转换为Python,并且无法找到在任何合理的时间内都能工作的解决方案。
M = diag(sum(a)) - a;
where = vertcat(in, out);
M(where,:) = 0;
M(where,where) = 1;
在这里,a是一个稀疏矩阵,而在这里是一个向量(按in / out排列)。我使用Python的解决方案是:
M = scipy.sparse.diags([degs], [0]) - A
where = numpy.hstack((inVs, outVs)).astype(int)
M = scipy.sparse.lil_matrix(M)
M[where, :] = 0 # This is the slowest line
M[where, where] = 1
M = scipy.sparse.csc_matrix(M)
但是由于A为334863x334863,因此大约需要三分钟。如果有人对如何加快此速度有任何建议,请贡献他们!为了进行比较,MATLAB很快就完成了这一步骤。
谢谢!
我用于与@seberg相似的任务属性的解决方案,并且不转换为lil
格式:
import scipy.sparse
import numpy
import time
def csr_row_set_nz_to_val(csr, row, value=0):
"""Set all nonzero elements (elements currently in the sparsity pattern)
to the given value. Useful to set to 0 mostly.
"""
if not isinstance(csr, scipy.sparse.csr_matrix):
raise ValueError('Matrix given must be of CSR format.')
csr.data[csr.indptr[row]:csr.indptr[row+1]] = value
def csr_rows_set_nz_to_val(csr, rows, value=0):
for row in rows:
csr_row_set_nz_to_val(csr, row)
if value == 0:
csr.eliminate_zeros()
安排评估时间
def evaluate(size):
degs = [1]*size
inVs = list(xrange(1, size, size/25))
outVs = list(xrange(5, size, size/25))
where = numpy.hstack((inVs, outVs)).astype(int)
start_time = time.time()
A = scipy.sparse.csc_matrix((size, size))
M = scipy.sparse.diags([degs], [0]) - A
csr_rows_set_nz_to_val(M, where)
return time.time()-start_time
并测试其性能:
>>> print 'elapsed %.5f seconds' % evaluate(334863)
elapsed 0.53054 seconds
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句