我在尝试解决某个线性方程式时出现内存不足错误(我将把代码放在下面)。因为我习惯于在C中编码,你可以对你创建的对象进行任何控制,我想知道我是否使用matlab效率低下。这是代码的相关部分
myData(n).AMatrix = sparse(fscanf(fid2, '%f', [2*M, 2*M]));
myData(n).AMatrix = transpose(myData(n).AMatrix);
%Read the covariance^2 matrix
myData(n).CovMatrix = sparse(fscanf(fid2, '%f', [2*M,2*M]));
myData(n).CovMatrix = reshape(myData(n).CovMatrix, [4*M*M,1]);
%Kronecker sum of A with itself
I=sparse(eye(2*M));
myData(n).AA=kron( I, myData(n).AMatrix)+kron( myData(n).AMatrix,I);
myData(n).AMatrix=[];
I=[];
%Solve (A+A)x = Vec(CovMatrix)
x=myData(n).CovMatrix\myData(n).AA;
尝试使用此代码我收到错误
Error using \
Out of memory. Type HELP MEMORY for your options.
Error in COV (line 62)
x=myData(n).CovMatrix\myData(n).AA;
在这段代码之前,我只打开一些文件(包含两个100x100的浮点数组),所以我不认为它们会导致这个错误。元素AMatrix是100 x 100阵列。因此,所讨论的线性方程的维数为10000 x 10000.AA也有一维内核,我不知道这是否会影响数值计算。后来我将获得的解决方案投影到内核的正交补码以获得“好”解决方案,但它出现在错误之后。对于熟悉它的人来说,这只是Lyapunov方程AX + XA = Cov的解决方案。矩阵A是稀疏的,它有4个50x50子锁,其中一个全部为零,另一个是同一性,另一个是对角线,另一个是非零元素。矩阵CovMatrix是对角线,对角线上有50个非零元素。
问题是目前我只能在配备2GB内存和2.5-6GB虚拟内存的小型个人计算机上进行计算。当我在matlab上运行memmory时它会给出
>> memory
Maximum possible array: 311 MB (3.256e+08 bytes) *
Memory available for all arrays: 930 MB (9.749e+08 bytes) **
Memory used by MATLAB: 677 MB (7.102e+08 bytes)
Physical Memory (RAM): 1931 MB (2.025e+09 bytes)
在内存方面我不是很了解,所以即使是简单的建议也是如此。感谢。
答案 0 :(得分:1)
复杂函数通常在计算期间分配临时内存。如果在计算期间分配了这种大小的临时密集矩阵,则10000x10000看起来非常大。您可以尝试一些较小的问题大小,并找出当前计算机的上限。