我有这个巨大的矩阵A,尺寸为900000x900000。我必须解决这个线性方程 Ax = b其中b是大小为900000x1的列矩阵。
我使用matlab的反斜杠运算符(如A \ b)来尝试获取x。然而,它冻结了,我无法得到x。大多数情况下我的内存问题。即使我在具有更高内存的计算机上运行它,它也会使系统变得非常慢,我不得不等待得到答案。
我该如何解决这个等式。我的矩阵非常稀疏。然而,它的频带更宽,但大多数元素都是零。 b是一个完整的矩阵。有什么建议吗?
答案 0 :(得分:2)
我做了一个项目,在那里我们也运行了如此庞大但幸运的非常稀疏的矩阵。 使用如此大的矩阵,您可以通过直接方法丢失:您永远无法计算逆,因为它将是一个密集的矩阵,您永远无法存储。 LU或Cholesky分解等方法也非常昂贵,因为它们会再次产生重要的填充,即它们会破坏零。
一种可行的替代方法是使用迭代方法。如果您知道矩阵是对称且肯定的,请尝试Conjugate gradient method:
x = pcg(A, b); %# Computes a solution to Ax = b, with A symm. pos-def.
如果方法收敛,我只是试试看看。我担心,证明正定性的假设并不容易。
如果你没有得到解决方案,还有更多的迭代方法。例如:
bicg - BiConjugate Gradient Method
bicgstab - BiConjugate Gradient Method (stabilized)
lsqr - Least Squares QR Method
gmres - Generalized Minimum Residual Method (I like this a lot)