【发布时间】:2016-11-23 20:15:09
【问题描述】:
我在尝试求解某个线性方程时遇到内存不足错误(我将在下面放置代码)。由于我习惯于在 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 个非零元素。矩阵 CovMatrix 是对角线,对角线上有 50 个非零元素。
问题是目前我只能在具有 2GB RAM 和 2.5-6GB 虚拟内存的小型个人计算机上进行计算。当我在 matlab 上运行内存时,它会给出
>> 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)
在记忆方面我不是很了解,所以我愿意接受即使是简单的建议。谢谢。
【问题讨论】:
-
AA,kron的输出,仍然稀疏吗?在issparse意义上? -
小注:
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)?
标签: matlab memory out-of-memory linear-algebra