在我的程序中,我遇到了一些大于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);
我使用单精度,女性给出了与双精度相同的精度
这样更好,我是对的吗?
答案 0 :(得分:5)
一些建议:
Ax=b
),则应使用MATLAB的backslash operator。答案 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。