在MATLAB中寻找大稀疏矩阵的零空间

4
在椭圆方程的有限差分离散化过程中,在二维域的所有边缘应用Neumann边界条件后,我会得到一个大稀疏矩阵。我需要找到它的转置空间以在两侧施加一致性条件。对于50X50和100X100的计算域,我能够利用Mathematica和MATLAB的NullSpace和null命令来处理可用的32GB RAM。但是如果计算域是500X250(一般情况下的数量级),存储大小为(500X250)X(500X250)的矩阵所需的RAM为125 GB,这是非常禁止的。我使用稀疏矩阵来存储这个超级矩阵,因此不再有空间限制。但我无法在其上使用“null”命令,因为该命令仅适用于完整矩阵。MATLAB建议在稀疏矩阵上使用"SVDS"命令。SVDS(A)只给出前6个奇异值和奇异向量。还有另一个命令SVDS(A,k,sigma),它会给出围绕标量奇异值"sigma"的"k"个奇异值和向量。当我将sigma=0时,以查找对应于“零”值的奇异向量,即空间基础向量时,会出现错误,指出"sigma"太接近矩阵的特征值。我的矩阵是奇异的,因此它的一个本征值为“零”。我应该如何避免这个错误?或者有没有更好的方法来处理手头的工具。我手边都有MATLAB和Mathematica。感谢您提前的帮助和建议。
最好的 Trinath

我不是专家,但请问自己是否有另一种方法来实现你想要的目标。这三个目标(解决你的问题,强制一致性,计算零空间)是否真的必要?半认真地说,如果你正在使用64位,则矩阵大小不应该是问题,甚至可以将其适配到内存中 - Dennis Jaheruddin
谢谢Dennis的快速回复。如果我使用稀疏程序,在MATLAB中就可以避免空间问题。我的问题是关于使用“SVDS”命令从零空间获取向量的。我也在探索其他方法来解决这个问题,并不断询问是否有更好的方法。Intel Poisson求解器不能解决椭圆方程的所有Neumann边界问题。我还在考虑利用矩阵中的对称模式。谢谢。 - Trinath
1个回答

1

我猜你可以尝试使用某种分解方法。

http://www.mathworks.co.uk/matlabcentral/fileexchange/11120-null-space-of-a-sparse-matrix

你试过这个吗?
或者也许是这个?

http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/249467

我相信它们应该有效,但我自己没有尝试过。另一种方法是进行QR分解(如果k是您的矩阵的秩,则会给您前k个独立列的排列。然后从k + 1到n的向量将为您的零空间提供基础)。
希望这可以帮助您。
祝福,
GL

嗨,Alea我尝试了你发来的第二个链接,它像魔法一样奏效!我使用了“eigs”,然后要求在一个小数值(如“0.0001”)周围获取2个向量/特征值,对于一个125000X125000稀疏双精度矩阵,我在19秒内得到了答案。非常感谢。最好的祝愿 - Trinath
所以链接失效了,如果答案实际上是解决方案的话,那就好多了。 - Cedric Martens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接