对稀疏矩阵的某些运算得到的结果会是普通矩阵(full),或者,在运算过程中需要先转换为普通矩阵,那样的话就会使用大量的内存。求逆很可能就是其中之一。
如果是这个原因,我想不出什么好办法。你最好看看矩阵数据本身有什么特点,看有没有可能把大问题分解为几个小一些的问题来分别求解,也就是采用分而治之的思想。
另外,推荐你花点时间认真读一下MATLAB文档中“Strategies for Efficient Use of Memory”和“Resolving "Out of Memory" Errors”这两部分,也许会有所启发。
========================
补充
又仔细研究了下,如果要计算inv(K)*p,可以试试 K\p,矩阵除的算法与求逆不同,很可能避免内存不足的问题。例如>> n=94507;
>> r=ceil(rand(2*n,1)*n);
>> c=ceil(rand(2*n,1)*n);
>> s=rand(2*n,1);
>> A=sparse(r,c,s,n,n);
>> b = rand(n,1);
>> inv(A);
??? Error using ==> inv
Out of memory. Type HELP MEMORY for your options.
>> x=A\b;
Warning: Matrix is singular to working precision.
(Type "warning off MATLAB:singularMatrix" to suppress this warning.)
可以看到,使用inv函数会导致Out of memory,而矩阵左除则没有问题(出现警告是因为矩阵奇异)。
另外,建议看看豆瓣上的一篇“要好好总结一下超大矩阵求逆的技巧了”。这个在CSDN上也有转载,但未注明出处。不贴链接了,不然度娘经常抽风,自己搜索标题就行。
祝好运!