2013-04-22 186 views
1

情況:如何處理「出於 內存」錯誤。如何在Matlab中解決10800x10800矩陣內存不足錯誤?

基本上問題是我用的是10800x10800矩陣。我在32位Windows系統上。 我得到了內存不足的錯誤當我這樣做:

a=zeros(10800,10800); 

這是我得到的內存:

>> memory 
Maximum possible array: 393 MB (4.120e+08 bytes) * 
Memory available for all arrays: 1097 MB (1.150e+09 bytes) ** 
Memory used by MATLAB: 639 MB (6.697e+08 bytes) 
Physical Memory (RAM): 895 MB (9.387e+08 bytes) 

* Limited by contiguous virtual address space available. 
** Limited by virtual address space available. 

操作系統:Windows 32位

+0

你還有足夠的記憶嗎? 10800x10800有點大。 – Mysticial 2013-04-22 09:19:49

+0

你使用的是什麼格式? – fpe 2013-04-22 09:20:05

+0

你想用這個大矩陣做什麼? – 2013-04-22 09:21:06

回答

2

如果存在的顯著部分將保持爲零矩陣,使用Sparse matrix

S = sparse(10800, 10800) 

如果第在不是這種情況下(矩陣密集),您可以使用以下選項:

  • 使用幾個較小的矩陣解決零件中的問題。
  • 使用具有大量內存的計算機和使用大型密集矩陣的Matlab 64bit
+0

它不是稀疏矩陣,後來用非零值填充。 – user2225930 2013-04-22 10:06:43

+0

我會編輯答案 – 2013-04-22 10:35:11

+0

謝謝。順便說一下,我可以修改Matlab使用多少內存嗎?我的意思是,我可以增加這些限制嗎? – user2225930 2013-04-22 10:58:04

5

矩陣存儲在連續的內存塊中。當處理非常大的矩陣時(這是因爲可能找不到足夠大的空閒塊),分配這些塊可能會產生問題。

既然你沒有提供有關你的代碼的任何細節,我只能建議的方式來解決這個問題:

  1. 如果你的基體中含有大量的零,其表示爲sparse matrix。它通過不存儲零來使用較少的存儲器來存儲這樣的矩陣。

  2. 將你的矩陣分解成更小的塊,並相應地修改你的算法。

  3. 如果它們可以適應您所使用的值範圍(相信Amro和Rody對此建議),請使用更高效的數據類型而不是雙精度。考慮使用single precisioninteger data types(並注意無符號整數!)。

+3

3)如果可能,使用'single'而不是'double'。這將減少一半所需的內存(如在:零([10800,10800],'單')') – Amro 2013-04-22 09:50:53

+2

@Amro:或者當然,儘可能更小的類型('邏輯','int8',.. )。取決於OP的課程 – 2013-04-22 09:54:07

+0

的實際問題我編輯了我的原始帖子,請檢查它。顯然,我的數組大小超過了Matlab設置的限制。我如何增加這些? – user2225930 2013-04-22 10:06:23