A,B,C和D是361x361x120雙矩陣。 我得到一個內存不足的錯誤,當我嘗試執行以下計算:內存錯誤:乘以大矩陣
Result = (A.*B)+(C.*D);
不幸的是,這些都必須在雙和我需要爲我的計算其餘以下結果。我試過分離加法步驟,但它被卡在第一個乘法(A * .B)上。是否有某種方法可以進一步分解這些步驟以避免內存問題?
謝謝!
-N。
A,B,C和D是361x361x120雙矩陣。 我得到一個內存不足的錯誤,當我嘗試執行以下計算:內存錯誤:乘以大矩陣
Result = (A.*B)+(C.*D);
不幸的是,這些都必須在雙和我需要爲我的計算其餘以下結果。我試過分離加法步驟,但它被卡在第一個乘法(A * .B)上。是否有某種方法可以進一步分解這些步驟以避免內存問題?
謝謝!
-N。
因爲你正在做一個元素乘以元素,你可以簡單地使用循環分割操作。下面是如何繁殖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);
謝謝,這個作品很棒。但是,只有當維度高於某個閾值時,這會在我的代碼中進一步導致問題。我也懷疑過內存問題。這些是我的統計數據:最大可能數組: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
嗯,問題是我有一些其他變量保存在工作區(我需要的所有這些變量),這明顯推動它超過閾值。 – 2012-08-07 19:01:40
您的每個'361x361x120'變量都是120 MB的內存。因此,在內存中有「A,B,C,D,E」佔用了近600 MB。看看你的代碼,找出你不再需要變量並刪除它,或者購買更多的RAM。 – slayton 2012-08-07 19:03:15
發生了什麼事是每個A
,B
,C
和D
矩陣的要求:的連續內存361*361*120*8
字節(或119
MB)。執行Result = (A.*B)+(C.*D);
時,兩個中間結果和最終結果中的每一個都需要相同的內存量(儘管之後會立即釋放中間結果)。在高峯時,它需要空間用於每個大小爲119MB的6到7個連續內存塊(請記住如何在任何時間點影響最大可能分配矩陣的大小)
如果您沒有足夠的內存來保存所有上述內容,請重寫表達式以重用現有變量,並儘快不再需要這些變量。
否則,請不要一次在內存中加載/存儲所有數據。 MATLAB的新版本允許您使用新的matfile
函數加載/保存部分MAT文件。您將使用for-loops計算塊的結果。
其他想法:如果數據包含很多零,請考慮使用稀疏矩陣。另外你是否真的需要雙精度,你可以將使用single
類型所需的內存減半。
當然,你總是可以遷移到64位機與匹配MATLAB安裝,購買儘可能多的RAM,你能負擔得起:)
感謝您的幫助! – 2012-08-08 19:20:45
你的命令似乎是相同的:
C = nan(361,361,120);
for i = 1:361;
for j = 1:361;
C(i,j,:) = rand(120,1) .* rand(120,1);
end
end
除了這個命令使用大大減少內存
感謝您的幫助! – 2012-08-08 19:21:22
請添加適當的語言標記。 – 2012-08-07 18:13:59
謝謝。添加。 – 2012-08-07 18:35:54
也許交換空間實際上是你需要的。 – 2013-10-25 15:45:11