2011-05-25 67 views
2

在我的程序中,我遇到了一些大於10000x10000的矩陣。 我不能轉置或反轉它們,這個問題如何克服?我們如何處理matlab中的大矩陣(大於10000x10000)

??? Error using ==> ctranspose 
Out of memory. Type HELP MEMORY for your options. 
Error in ==> programname1 at 70 
    B = cell2mat(C(:,:,s))'; 
Out of memory. Type HELP MEMORY for your options. 
Example 1: Run the MEMORY command on a 32-bit Windows system: 


    >> memory 
    Maximum possible array:    677 MB (7.101e+008 bytes) * 
    Memory available for all arrays: 1602 MB (1.680e+009 bytes) ** 
    Memory used by MATLAB:    327 MB (3.425e+008 bytes) 
    Physical Memory (RAM):    3327 MB (3.489e+009 bytes) 

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

Example 2: Run the MEMORY command on a 64-bit Windows system: 

    >> memory 
    Maximum possible array:    4577 MB (4.800e+009 bytes) * 
    Memory available for all arrays:  4577 MB (4.800e+009 bytes) * 
    Memory used by MATLAB:     330 MB (3.458e+008 bytes) 
    Physical Memory (RAM):    3503 MB (3.674e+009 bytes) 

========================================= =====================================

memory 
% Maximum possible array:   1603 MB (1.681e+009 bytes) * 
% Memory available for all arrays: 2237 MB (2.346e+009 bytes) ** 
% Memory used by MATLAB:    469 MB (4.917e+008 bytes) 
% Physical Memory (RAM):    3002 MB (3.148e+009 bytes) 


I have used sparse for C. 

B = cell2mat(C); 
clear C  %# to reduce the allocated RAM 
P=B\b; 

Name   Size     Bytes Class  Attributes  

    B   5697x5697   584165092 double sparse, complex 
    C   1899x1899   858213576 cell      
    b   5697x1     91152 double complex   

============================================================================== 
??? Error using ==> mldivide 
Out of memory. Type HELP MEMORY for your options. 

Error in ==> programname at 82 
    P=B\b; 

============================================================================== 

編輯:11年5月27日

Name   Size     Bytes Class  Attributes 

    C   997x997    131209188 cell 
    B   2991x2991    71568648 single complex   
    Bdp   2991x2991   143137296 double complex   
    Bsparse  2991x2991   156948988 double sparse, complex 

    Bdp=double(B); 
    Bsparse=sparse(Bdp); 

我用單精度,女巫得到相同的精度在雙精度

更好,我說得對嗎?

+2

使用帶有大量RAM的64位系統? – 2011-05-25 03:03:17

+0

米奇是對的;你現在有什麼記憶參數? (我認爲這些不是稀疏矩陣,對嗎?) – 2011-05-25 03:41:51

+0

我使用32位。矩陣是複數對稱的,其2/3的元素是零。大量的RAM!我有一個英特爾酷睿2單處理器1.4 Ghz和3 GM內存。我認爲這是很多!我對嗎? ;-) – Abolfazl 2011-05-25 04:46:23

回答

5

幾點建議:

  1. 如果可能的話,作爲@yoda建議,使用稀疏矩陣
  2. 你真的需要逆?如果你正在解決一個線性系統(Ax=b),你應該使用MATLAB的backslash operator
  3. 如果您確實需要巨大的密集矩陣,則可以使用distributed arraysMATLAB distributed computing server來利用多臺機器的內存。
+0

** B **的最大尺寸是469MB?我認爲仍然只是第三個。 – Abolfazl 2011-05-25 07:52:41

+0

編輯在11年7月27日,與單一precition矩陣的大小大大減少。 – Abolfazl 2011-05-27 13:28:25

1

3GB並不是很多,當你擁有的每個矩陣都是600 MB時,它都是自己的。如果無法進行算法更改,則需要64位操作系統上的64位matlab,並提供更多的RAM。這是獲得大量記憶的唯一途徑。注意,使用3 GB,Matlab只有2.2 GB,最大的塊是1.5 GB - 這只是您的兩個基礎。

+0

這是DDA方法中的光散射問題。如果N偶極子位於任意位置rj, 那麼A的9N^2元素將是非簡併的。 這些元素(8字節/複數) 的存儲將需要72(N/10^3)2兆字節。通過在格子上定位偶極子,A的元素變得高度退化,因爲它們僅取決於位移 rj-ri。因此,內存需求在N上而不是在N^2上大致線性地取決於 。 – Abolfazl 2011-05-26 07:35:35

+0

程序DDSCAT的總內存需求爲 -0.58(NxNyNz/1000)Mbytes,其中Nx X Ny X Nz爲 包含所有N偶極子的矩形體積 [1] B。 T. Draine和P. J. Flatau,Vol。 11,第4號/ 1994年4月/ J。選擇。 SOC。上午。 A – Abolfazl 2011-05-26 07:36:01

+0

順便說一句,我想我必須更多地研究DDSCAT。 – Abolfazl 2011-05-26 07:38:03

1

Matlab有一個簡單的方法來處理巨大的矩陣,如1000000 * 1000000。 這些矩陣通常是稀疏矩陣,不需要爲零值的矩陣元素分配RAM存儲器。 所以你應該只使用這個命令:

A =稀疏(1000000,1000000); 「定義一個1000000×1000000的矩陣。」

然後,您可以通過像「spdiags」這樣的命令設置對角線非零元素。 看到此鏈接:你不能用「INV」命令來反轉矩陣A http://www.mathworks.nl/help/matlab/ref/spdiags.html

注意,因爲「INV」做了一個正常的矩陣,並使用了大量的內存空間(可能與「內存不足。 「error)

要求解像A * X = B的等式,可以使用X = A \ B。