我在 Matlab 中有一个大约 2000 个稀疏方程的线性系统。对于我的最终结果,我只需要其中一个变量的值:其他值无关紧要。虽然简单地求解方程并提取正确的变量并没有真正的问题,但我想知道是否有更快的方法或 Matlab 命令。例如,只要计算出所需的变量,程序原则上就可以停止运行。
有没有人知道这是否可能,或者继续解决整个系统是否会更容易?
我在 Matlab 中有一个大约 2000 个稀疏方程的线性系统。对于我的最终结果,我只需要其中一个变量的值:其他值无关紧要。虽然简单地求解方程并提取正确的变量并没有真正的问题,但我想知道是否有更快的方法或 Matlab 命令。例如,只要计算出所需的变量,程序原则上就可以停止运行。
有没有人知道这是否可能,或者继续解决整个系统是否会更容易?
大部分的计算时间都花在了矩阵的求逆上,如果我们能找到一种方法来避免矩阵的完全求逆,那么我们也许可以提高计算时间。假设我只对最后一个变量的解决方案感兴趣x(N)
。使用我们计算的标准方法
x = A\b;
res = x(N);
假设A
是满秩,我们可以改为使用增广矩阵的 LU 分解[A b]
来得到x(N)
如下所示的
[~,U] = lu([A b]);
res = U(end,end-1)/U(end,end);
x(N)
这本质上是执行高斯消除,然后使用反向替换求解。
我们可以通过交换LU 分解之前x
的列来扩展它以找到 的任何值,A
x_index = 123; % the index of the solution we are interested in
A(:,[x_index,end]) = A(:,[end,x_index]);
[~,U] = lu([A b]);
res = U(end,end)/U(end,end-1);
在 MATLAB2017a 中使用 10,000 个随机 200 维系统进行基准测试,我们得到了轻微的加速
Total time direct method : 4.5401s
Total time LU method : 3.9149s
请注意,如果A
条件不佳,您可能会遇到一些精度问题。
此外,这种方法没有利用A
. 在我的实验中,即使使用 2000x2000 稀疏矩阵,一切都明显变慢了,LU 方法也明显变慢了。也就是说,完整的矩阵表示只需要大约 30MB,这在大多数计算机上应该不是问题。