我在Matlab中有一个约2000个稀疏方程的线性系统。对于我的最终结果,我只需要其中一个变量的值:其他值无关紧要。虽然简单地求解方程并提取正确的变量没有真正的问题,但我想知道是否有更快的方法或Matlab命令。例如,一旦计算出所需的变量,程序原则上就可以停止运行。
是否有人知道这是否可能,或者是否更容易继续解决整个系统?
答案 0 :(得分:2)
大部分计算时间用于反转矩阵,如果我们能找到避免完全反转矩阵的方法,那么我们就可以改善计算时间。让我们假设我只对最后一个变量x(N)
的解决方案感兴趣。使用我们计算的标准方法
x = A\b;
res = x(N);
假设A
是满级,我们可以使用增强矩阵[A b]
的LU分解来获得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);
使用10,000个随机200维系统的MATLAB2017a的基准测试性能我们得到了轻微的加速
Total time direct method : 4.5401s
Total time LU method : 3.9149s
请注意,如果A
条件不良,您可能会遇到一些精确问题。
此外,这种方法并没有利用A
的稀疏性。在我的实验中,即使使用2000x2000稀疏矩阵,一切都显着减慢,LU方法明显变慢。那说全矩阵表示只需要大约30MB,这在大多数计算机上都不应该成为问题。
答案 1 :(得分:1)