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

我在尝试解某个线性方程时出现内存不足错误(我将在下面列出代码)。因为我习惯于用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也有一维核,我不知道这是否会影响数值计算。后来,我将得到的解投影到内核的正交补中,以得到“好”解,但它是在错误之后出现的。对于熟悉它的人来说,这只是李雅普诺夫方程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
)?