Matlab求解线性方程时的记忆误差
我在尝试解某个线性方程时出现内存不足错误(我将在下面列出代码)。因为我习惯于用C语言编写代码,在这里你可以控制你创建的对象,我想知道我是否在低效地使用matlab。下面是代码的相关部分Matlab求解线性方程时的记忆误差,matlab,memory,out-of-memory,linear-algebra,Matlab,Memory,Out Of Memory,Linear Algebra,我在尝试解某个线性方程时出现内存不足错误(我将在下面列出代码)。因为我习惯于用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).CovM
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也有一维核,我不知道这是否会影响数值计算。后来,我将得到的解投影到内核的正交补中,以得到“好”解,但它是在错误之后出现的。对于熟悉它的人来说,这只是李雅普诺夫方程AX+XA=Cov的一个解。矩阵A是稀疏的,它有4个50x50子锁,其中一个是全零,另一个是恒等式,另一个是对角的,另一个少于1000个非零元素。矩阵为对角矩阵,其中有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)
说到记忆,我不是很有学问,所以即使是简单的建议,我也乐于接受。谢谢。复杂函数通常在计算期间分配临时内存。如果在计算过程中分配了这样大小的临时密集矩阵,则10000x1000看起来相当大。您可以尝试一些较小的问题大小,并找出当前计算机的上限。是
AA
,还是kron
的输出稀疏?在issparse
sense?小注释中:sparse(eye(2*M))
可以使用speye(2*M)
完成。如果您可以编写一些代码来创建AMatrix和CovMatrix(即使使用随机值),或者将这两个文件发布到某个地方,那将是一件好事,因为我试图根据你的描述重新创建你的数组,但我不确定我是否做对了。感谢您的考虑。我不确定Matlab的\可能愚蠢地试图分配一个密集矩阵。我想尝试用lu(AA)
(或ldl
或chol
如果正定等,都可以处理稀疏输入并产生稀疏输出)手动分解线性系统,并手动求解分解系统。在Matlab中,A\B
相当于INV(A)*B
,那么,如果你在做CovMatrix\AA
,这不等于inv(CovMatrix)*AA
?右除法应该是左除法吗(或者应该切换CovMatrix
和AA
)?