我们如何在matlab中处理大型矩阵(大于10000x10000)

时间:2011-05-25 02:59:18

标签: matlab large-data-volumes

在我的程序中,我遇到了一些大于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; 

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

编辑:27.05.11

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);

我使用单精度,女性给出了与双精度相同的精度

这样更好,我是对的吗?

3 个答案:

答案 0 :(得分:5)

一些建议:

  1. 如果可能的话,正如@yoda建议的那样,使用稀疏矩阵
  2. 你真的需要反向吗?如果您正在求解线性系统(Ax=b),则应使用MATLAB的backslash operator
  3. 如果您确实需要大量密集矩阵,则可以使用distributed arraysMATLAB distributed computing server来利用多台计算机的内存。

答案 1 :(得分:1)

当你拥有的每个矩阵都是600 MB时,3GB并不是很多。如果您无法进行算法更改,则需要在64位操作系统上使用64位matlab,并且需要更多RAM。这是获得大量记忆的唯一方法。请注意,对于3 GB,Matlab只有2.2 GB,最大的块是1.5 GB - 这只是你的2个matricies。

答案 2 :(得分:1)

Matlab有一种简单的方法来处理像1000000 * 1000000这样的巨大订单矩阵。 这些矩阵通常是稀疏矩阵,没有必要为零值的矩阵元素分配RAM存储器。 所以你应该使用这个命令:

A =稀疏(1000000,1000000); “定义一个1000000乘1000000的零矩阵。”

然后,您可以通过“spdiags”之类的命令设置对角线非零元素。 请参阅此链接:http://www.mathworks.nl/help/matlab/ref/spdiags.html

请注意,您不能使用“inv”命令来反转矩阵A,因为“inv”创建了一个普通矩阵并使用了大量的RAM空间。(可能是“内存不足”错误)

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