python中用于矩阵乘法的稀疏矩阵和密集矩阵之间的差异

时间:2017-05-16 14:08:37

标签: python matrix sparse-matrix

我想计算Python中2d函数的一阶导数。为此我编写了以下脚本:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.sparse as scspar

r_num = 10000
r_vec = np.linspace(-10, 10, r_num)
X_mat, Y_mat = np.meshgrid(r_vec, r_vec)

x_square = lambda X, Y: np.exp(-np.power(X, 2)/2-np.power(Y, 2)/2)
dh = abs(r_vec[1]-r_vec[0])

A = (np.eye(r_num)*(-30)+np.eye(r_num, k=-1)*(16)+np.eye(r_num, k=1)*(16)-np.eye(r_num, k=2)-np.eye(r_num, k=-2))/(12*dh*dh)
C = (np.eye(r_num)*(-30)+np.eye(r_num, k=-1)*(16)+np.eye(r_num, k=1)*(16)-np.eye(r_num, k=-2)-np.eye(r_num, k=2))/(12*dh*dh)
B = scspar.csc_matrix((np.eye(r_num)*-30+np.eye(r_num, k=-1)*16+np.eye(r_num, k=1)*16-np.eye(r_num, k=-2)-np.eye(r_num, k=2))/(12*dh*dh))
T = x_square(X_mat, Y_mat)

plt.imshow(A-B)
plt.show()

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X_mat, Y_mat, T*B+(T.transpose()*B).transpose())
plt.show()

现在矩阵AB是相等的,除了一个被定义为稀疏,另一个被定义为密集。但是在更换线路时

T*B+(T.transpose()*B).transpose()

T*A+(T.transpose()*A).transpose()

结果发生了显着变化。为什么呢?

1 个答案:

答案 0 :(得分:0)

如果它们相同,它们应该具有相同的结果。因此,你可以得出结论,你在某个地方犯了错误。

来自scipy docs

  

尽管它们与NumPy阵列有相似之处,但强烈反对   因为NumPy可以直接在这些矩阵上使用NumPy函数   没有正确地将它们转换为计算,导致意外(和   不正确的)结果。如果您确实想要将NumPy函数应用于这些函数   矩阵,首先检查SciPy是否有自己的实现   给定稀疏矩阵类,或将稀疏矩阵转换为NumPy   数组(例如,使用类的toarray()方法)之前   应用该方法。

实际上,文档告诉我们不要在这些稀疏矩阵上使用numpy函数,而是使用specialized functions from scipy来操作稀疏矩阵。