2017-05-07 174 views
0

我试图在Richardson-Lucy解卷积算法中实现停止标准described in this paper。我的测试图像有2.2 Mpx。我需要计算:在scipy Python中使用稀疏矩阵进行计算

estimator = numpy.dot(P_e_ortho, im_deconv.flatten()) 

其中

im_deconv = [[]] # Image L channel as a 2D array 
m = 2.2E6 # im_deconv.size 

P_e_ortho = scipy.sparse.identity(m, dtype='int8') - \ 
      1/m * np.ones((m, m), dtype='int8') 

所以基本上,P_e_ortho1 - 1/m对角和其他地方- 1/m

现在这段代码返回一个内存错误(需要4.8×10 12个单元)。我怎样才能避免在计算中处理整个矩阵?

scipy.sparse.identity(m, dtype='int8') * (1 - 1/m) 

可以很好地设置对角线,但如何更改非对角元素?

发现

回答

0

解决方案:

# Construct a Row-based linked list sparse matrix 
P_e_ortho = scipy.sparse.lil_matrix((m, m)) 

P_e_ortho[:, :] = -1/m # Sets all elements 
P_e_ortho.setdiag(1-1/m) # Sets the diagonal 
P_e_ortho = P_e_ortho.tocsr() # Convert to Compressed Sparse Row matrix 

estimator = P_e_ortho.dot(im_deconv.flatten()) # Compute the dot product 
+0

我很惊讶这不会给你一个内存错误。您已将矩阵的所有元素设置为非零值。总存储量将大于相应的密集阵列,尽管分割成多个阵列。 '.dot'也会慢很多。 – hpaulj

+0

@hpaulj是的,它不适用于这个问题,我放弃了这种方法。这篇论文展示了这种技术在小图片上的实现,对大图片来说并不可行。我改用正规化因素。但是该解决方案仍然适用于构建稀疏矩阵。 –