我有一个10000 * 10000(矩阵A)稀疏矩阵,每行只包含5个非零元素。
现在的问题是对角元素和常量(在B矩阵s.t. AX = B中)在每次迭代后都会得到更新。如果我按照通常的Matlab函数:“inv”或通过高斯消除,对于单次迭代计算解决方案大约需要25秒,并且问题所需的迭代次数有点依次为:100-500计算最终的解决方案:X。
如果我不想使用并行计算,我需要一些关于这个的建议 帮助伙计们! :)
答案 0 :(得分:-1)
叹息。人们认为只是因为他们在学校里学到了A * X = B的解决方案是形成X = inv(A)* B,这就是要做的事情。是的,你的教科书说要这样做。令人惊讶的是,有很多人试图教你这样的事情。可悲的是,他们错了,他们教别人教导错误的东西,甚至把它写进书本。这种愚蠢的传播,似乎永远不会结束。即使教科书作者自己知道A \ B在理论上比inv(A)* B更好,它仍然更容易以逆矩阵形式编写。
警告:你不想形成逆矩阵,而且上帝禁止,你不想使用高斯消元法。 (让专业人员在编译工具中为您编写代码。)相反,在MATLAB中使用反斜杠,这是有效的&写得很好。
X = A \ B;
如果您经常解决相同的系统,请使用像LU这样的分解。更好的是使用许多右侧作为B的列,同时解决所有系统。不可否认,如果矩阵不断变化,这不是一种选择,但仍然是反斜杠。
(为什么inv不是一个好主意?它创建一个基本上是FULL矩阵,只有很少的零。它比反斜杠等慢,而不是像数字一样稳定。)
最后,如果您的矩阵稀疏,那么为什么在上帝的名义中你没有使用稀疏存储器来制作矩阵?稀疏矩阵的反斜杠速度会非常快。