2012-08-07 62 views
0

A,B,C和D是361x361x120雙矩陣。 我得到一個內存不足的錯誤,當我嘗試執行以下計算:內存錯誤:乘以大矩陣

Result = (A.*B)+(C.*D); 

不幸的是,這些都必須在雙和我需要爲我的計算其餘以下結果。我試過分離加法步驟,但它被卡在第一個乘法(A * .B)上。是否有某種方法可以進一步分解這些步驟以避免內存問題?

謝謝!

-N。

+0

請添加適當的語言標記。 – 2012-08-07 18:13:59

+0

謝謝。添加。 – 2012-08-07 18:35:54

+0

也許交換空間實際上是你需要的。 – 2013-10-25 15:45:11

回答

0

因爲你正在做一個元素乘以元素,你可以簡單地使用循環分割操作。下面是如何繁殖A和B,並將結果保存到矩陣C的例子:

A = rand(361, 361, 120); 
B = rand(361, 361, 120); 
C = nan(361,361,120); 

for i = 1:size(A,1); 
    for j = 1:size(A,2); 
    C(i,j,:) = A(i,j,:) .* B(i,j,:); 
    end 
end 

你應該能夠得到它與一個循環,而不是兩個嵌套循環工作。

我不知道爲什麼你會得到一個內存不足的錯誤,但以下在我的機器上執行罰款。另外,乘法不應該需要太多內存。

A = rand(361, 361, 120); 
B = rand(361, 361, 120); 
C = rand(361, 361, 120); 
D = rand(361, 361, 120); 

E = (A.*B) + (C.*D); 
+0

謝謝,這個作品很棒。但是,只有當維度高於某個閾值時,這會在我的代碼中進一步導致問題。我也懷疑過內存問題。這些是我的統計數據:最大可能數組:651 MB(6.826e + 08字節)* 內存可用於所有陣列:1215 MB(1.274e + 09字節)** MATLAB使用的內存:588 MB(6.161e + 08字節) 物理內存(RAM):5940 MB(6.228e + 09字節) – 2012-08-07 18:52:16

+0

嗯,問題是我有一些其他變量保存在工作區(我需要的所有這些變量),這明顯推動它超過閾值。 – 2012-08-07 19:01:40

+0

您的每個'361x361x120'變量都是120 MB的內存。因此,在內存中有「A,B,C,D,E」佔用了近600 MB。看看你的代碼,找出你不再需要變量並刪除它,或者購買更多的RAM。 – slayton 2012-08-07 19:03:15

0

發生了什麼事是每個ABCD矩陣的要求:的連續內存361*361*120*8字節(或119 MB)。執行Result = (A.*B)+(C.*D);時,兩個中間結果和最終結果中的每一個都需要相同的內存量(儘管之後會立即釋放中間結果)。在高峯時,它需要空間用於每個大小爲119MB的6到7個連續內存塊(請記住如何在任何時間點影響最大可能分配矩陣的大小)

如果您沒有足夠的內存來保存所有上述內容,請重寫表達式以重用現有變量,並儘快不再需要這些變量。

否則,請不要一次在內存中加載/存儲所有數據。 MATLAB的新版本允許您使用新的matfile函數加載/保存部分MAT文件。您將使用for-loops計算塊的結果。

其他想法:如果數據包含很多零,請考慮使用稀疏矩陣。另外你是否真的需要雙精度,你可以將使用single類型所需的內存減半。

當然,你總是可以遷移到64位機與匹配MATLAB安裝,購買儘可能多的RAM,你能負擔得起:)

+0

感謝您的幫助! – 2012-08-08 19:20:45

0

你的命令似乎是相同的:

C = nan(361,361,120); 
    for i = 1:361; 
     for j = 1:361; 
     C(i,j,:) = rand(120,1) .* rand(120,1); 
     end 
    end 

除了這個命令使用大大減少內存

+0

感謝您的幫助! – 2012-08-08 19:21:22