簡體   English   中英

巨大的對稱矩陣 - 如何巧妙地存儲和使用它 - Python

[英]Huge symmetric matrix - how to store and use it cleverly - Python

我有一個對稱矩陣。 現在,問題是我需要填充這樣的尺寸矩陣(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

這里, 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]

要節省50%的空間,可以使用lil_sparse矩陣。

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)

然后,您可以編寫輔助函數來代替訪問矩陣本身:

def getA(i, j):
    if i < j:
        return A[j, i]
    else:
        return A[i, j] 

但是,如果您想使用標准方法計算矩陣的逆矩陣,想要有效地乘以矩陣或完全執行任何操作,這對您沒有多大幫助。

將整個矩陣保存在內存中可能是更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM