2013-07-24 41 views
1

我正在做一些信號處理,我需要生成一個泊松矩陣,但是我正在使用的數據足夠大,以至於我目前正在執行內存的方式耗盡了內存。內存問題 - 大泊松矩陣

我一直在琢磨這一點,現在有點難住,所以我希望你們可以幫我找到一個更有效的方法來生成矩陣,即解決了問題matlab內存不足。

反正這裏是我迄今爲止

n = 20; 

B = zeros(n^2,n^2); 
for i = 1:n^2 
for j = 1:n^2 
    if i == j 
     B(i,j) = 4; 
    elseif i == j+1 
     B(i,j) = -1; 
    elseif i == j-1 
     B(i,j) = -1; 
    elseif i == j+n 
     B(i,j) = -1; 
    elseif i == j-n 
     B(i,j) = -1; 
    end 
end 
end 

for i = n:n:n^2-1 
    for j = n:n:n^2-1 
     B(i+1,j) = 0; 
     B(i,j+1) = 0; 
    end 
end 

C = sparse(B); 

提前感謝!

回答

2

A +努力!但有一種更有效的方法可以做到這一點。你需要稀疏矩陣。嘗試像

n = 20; 
e = ones(n^2,1); 
o = e; 
for i = n:n:n^2-1 
    o(i) = 0; 
end 
A = spdiags([-e -o 4*e -o -e], [-(n+1) -1 0 1 (n+1)], n^2, n^2); 

如果你真的想自己生成它。我發佈這個方法,所以你可以學習如何使用普通的實踐來製作帶狀稀疏矩陣。但是,對於一個泊松矩陣可以簡單地使用內置的MATLAB之一:

B = gallery('poisson',n); 

爲了說明爲什麼你需要稀疏矩陣,嘗試檢查各種n值的稀疏性與

sparsity = nnz(B)/prod(size(B)); 

增加數n到20左右的某個地方是泊松矩陣實際上是有差別的,因爲它們實際上很稀疏(接近1%是nonzeros)。 MATLAB中所有這些零都是浪費空間。所以當你通過完整的for-loop方法生成B時,你正在消耗內存!要看到其中的差別嘗試在你的原代碼類似

sB = whos('B'); 
sC = whos('C'); 
disp(sA.bytes); 
disp(sB.bytes); 

地看到,對於n = 20你會得到B = 128萬個字節,C = 33928個字節。但是使用這個規定的方法,那麼A = 33896字節!這差不多有1.2 MB!