joh*_*nry 6 python symmetric matrix-inverse bigdata matrix-multiplication
我有一个对称矩阵.现在,问题在于我需要填充这样的维度矩阵(32**3) x (32**3).我需要填充矩阵的原因是因为在我的程序中我使用它进行各种计算:我正在反转它,我将它与其他矩阵相乘......在我看来,为了执行这些各种你需要实际存储完整矩阵的计算,你不能使用例如只有一半(但我可能是错的,在这种情况下请告诉我应该怎么做).
问题是这样的矩阵对于我的计算机来说太大了,我得到以下错误:
Traceback (most recent call last):
File "program.py", line 191, in <module>
A = zeros((n_x*n_y*n_z. n_x*n_y*n_z), float)
MemoryError
Run Code Online (Sandbox Code Playgroud)
在这里,n_x = 32.那么,我该如何解决这个问题呢?有没有办法存储这么大的矩阵,或者是一种避免存储它的聪明方法?如果我可以使用它们而不会在计算中出错,那么这两种方式对我来说都没问题.
为了完整起见,我在下面报告A矩阵的构建方式:
n_x = n_y = n_z = 32
L_x = L_y = L_z = n_x
A = zeros((n_x*n_y*n_z , n_x*n_y*n_z), float)
P_0 = 50.0
sigma_x = sigma_y = sigma_z = 0.9
sigma_root = np.sqrt(sigma_x**2 + sigma_y**2 + sigma_z**2)
twosigmasquared = 2.*sigma_root**2
for l in range(n_x*n_y*n_z):
for m in range(n_x*n_y*n_z):
A[l][m] = P_0*(L_x/(np.sqrt(2.*np.pi)*sigma_root*n_x**2)) * (L_y/(np.sqrt(2.*np.pi)*sigma_root*n_y**2)) * (L_z/(np.sqrt(2.*np.pi)*sigma_root*n_z**2))*np.exp((-((x[l]-x[m])**2)-((y[l]-y[m])**2)-((z[l]-z[m])**2))/twosigmasquared)
A[m][l] = A[l][m]
Run Code Online (Sandbox Code Playgroud)
为了节省 50% 的空间,您可以使用lil_sparsescipy 中的矩阵。
from scipy import sparse as S
A = S.lil_matrix((n_x*n_y*n_z , n_x*n_y*n_z), float)
n_x = n_y = n_z = 32
L_x = L_y = L_z = n_x
P_0 = 50.0
sigma_x = sigma_y = sigma_z = 0.9
sigma_root = np.sqrt(sigma_x**2 + sigma_y**2 + sigma_z**2)
twosigmasquared = 2.*sigma_root**2
for l in range(n_x*n_y*n_z):
for m in range(l, n_x*n_y*n_z): # Filling only the top half
A[l][m] = P_0*(L_x/(np.sqrt(2.*np.pi)*sigma_root*n_x**2)) * (L_y/(np.sqrt(2.*np.pi)*sigma_root*n_y**2)) * (L_z/(np.sqrt(2.*np.pi)*sigma_root*n_z**2))*np.exp((-((x[l]-x[m])**2)-((y[l]-y[m])**2)-((z[l]-z[m])**2))/twosigmasquared)
Run Code Online (Sandbox Code Playgroud)
然后,您可以编写一个辅助函数,而不是访问矩阵本身:
def getA(i, j):
if i < j:
return A[j, i]
else:
return A[i, j]
Run Code Online (Sandbox Code Playgroud)
但是,如果您想使用标准方法计算矩阵的逆,想要有效地乘以矩阵或进行任何操作,这对您没有多大帮助。
将整个矩阵保存在内存中可能是更好的选择。