我實作了一個有限差分演算法來求解 PDE。
網格是大小為 [Nx, Nz] 的結構化二維域,求解 Nt 次。
我預先分配了包含所有解決方案的物件:
sol = zeros(Nx, Nz, Nt, 'single') ;
這很容易變得太大,并且出現“記憶體不足”錯誤。不幸的是sparse,它不適用于 N 維陣列。
對于這個問題,知道這些值并不重要,不用說,RAM 使用量會隨著網格間距的減小和模擬時間的增加而呈指數增長。
我知道我不需要為了解決方案的進步而存盤每個時間瞬間。只存盤前兩個時間步就足夠了。但是,出于后處理的原因,我需要在所有時間步長(或至少是總數的約數)訪問解決方案。它可能有助于指定,即使在解決方案之后,網格仍然主要由零填充.
我是在打一場失敗的戰斗還是有更有效的方式來進行(其他型別的物件,矢量化......)?
謝謝你。
uj5u.com熱心網友回復:
您可以將陣列存盤為稀疏的線性形式;即長度等于維度乘積的列向量:
sol = sparse([], [], [], Nx*Nz*Nt, 1); % sparse column vector containing zeros
然后,而不是正常索引,
sol(x, z, t),
您需要將索引x, z,t轉換為相應的線性索引:
對于您使用的標量索引
sol(x Nx*(z-1) Nx*Nz*(t-1))為方便起見,您可以定義一個輔助函式:
ind = @(sol, x, y, t) sol(x Nx*(z-1) Nx*Nz*(t-1))因此索引變得更具可讀性:
ind(sol, x, z, t)對于一般(陣列)索引,您需要
reshape沿不同維度的索引,以便隱式擴展產生適當的線性索引:sol(reshape(x,[],1,1) Nx*(reshape(z,1,[],1)-1) Nx*Nz*(reshape(t,1,1,[])-1))當然也可以封裝成一個函式。
檢查轉換為線性索引是否有效(一般情況下,使用非稀疏陣列與正常索引進行比較):
Nx = 15; Nz = 18; Nt = 11;
sol = randi(9, Nx, Nz, Nt);
x = [5 6; 7 8]; z = 7; t = [4 9 1];
isequal(sol(x, z, t), ...
sol(reshape(x,[],1,1) Nx*(reshape(z,1,[],1)-1) Nx*Nz*(reshape(t,1,1,[])-1)))
給
ans =
logical
1
uj5u.com熱心網友回復:
您可以創建一個稀疏矩陣的元胞陣列來存盤結果。但是,如果使用完整矩陣比使用稀疏矩陣更快并將完整矩陣轉換為稀疏矩陣并將其放置在單元格中,則可以在完整矩陣上執行計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/426536.html
下一篇:如何根據矩陣中第一列的值洗掉行
