【发布时间】:2016-12-02 09:11:19
【问题描述】:
这个问题可能过于宽泛,无法在此处发布,但我会尽可能具体。如果你还是觉得太笼统,我就直接删了。
- 请查看底部的 EDIT,了解我对该主题的最终想法。
- 如果您可以访问并行计算工具箱并拥有 NVIDIA GPU,还可以查看 Ander Biguri 的回答。
我的问题:
我正在使用 Newmark 方案(二阶隐式)求解动态方程,其中涉及为 x 求解许多 A*x=b 形式的线性系统。
我已经优化了所有不涉及求解线性系统的代码。就目前而言,线性系统求解在此过程中占用了高达 70% 的计算时间。
虽然我使用了 MATLAB 的 linsolve,但我的矩阵 A 没有任何可以用作 opts 输入的属性 linsolve。
想法:
如linsolve 的文档中所见:
如果 A 具有 opts 中的属性,则 linsolve 比 mldivide 快, 因为 linsolve 不执行任何测试来验证 A 是否具有 指定属性
据我所知,通过使用mldivide,MATLAB 将使用 LU 分解,因为我的矩阵 A 除了是正方形之外没有任何特定属性。
我的问题:
所以我想知道我是否可以通过首先使用 MATLAB 的 lu 分解 A 来获得一些时间,然后将这些提供给 linsolve 以便解决 x = U\(L\b) 与 opts 分别为上三角和下三角.
这样我就可以防止 MATLAB 执行在 mldivide 过程中发生的所有属性检查。
注意:我绝对不会期待巨大的时间收益。但在长达一周的计算中,即使是 2% 也很重要..
现在你可能会问,我为什么不自己尝试一下呢?好吧,我的计算大约运行到星期二,我想问一下是否有人已经尝试过这个并获得了时间,从而摆脱了由于 mldivide 进行矩阵属性检查而产生的开销。
玩具示例:
A=randn(2500);
% Getting A to be non singular
A=A.'*A;
x_=randn(2500,1);
b=A*x_;
clear x_
% Case 1 : mldivide
tic
for ii=1:100
x=A\b;
end
out=toc;
disp(['Case 1 time per iteration :' num2str((out)/100)]);
% Case 2 : LU+linsolve
opts1.LT=true;
opts2.UT=true;
tic;
for ii=1:100
[L,U]=lu(A);
% It seems that these could be directly replaced by U\(L\b) as mldivide check for triangularity first
Tmp=linsolve(L,b,opts1);
x=linsolve(U,Tmp,opts2);
end
out2=toc;
disp(['Case 2 time per iteration :' num2str((out2)/100)]);
编辑
所以我有机会尝试一些事情。
我之前在linsolve 的文档中错过了如果您不指定任何opts 输入,它将默认使用LU 求解器,这正是我想要的。用它做一些时间测试(并考虑到@rayryeng 对“timeit那个坏男孩”的评论),与mldivide相比,它节省了大约 2~3% 的处理时间,如下所示。就时间增益而言,这并不是什么大问题,但在长达一周的计算中却是不可忽视的。
timeit 在1626*1626 线性系统上得到结果:
mldivide:
t1 =
0.102149773097083
linsolve:
t2 =
0.099272037768204
亲戚:0.028171725121151
【问题讨论】:
-
我认为它不会改变任何东西!为什么 ?如果您阅读 mldivide 的文档,您可以看到用于确定求解器的流程图。在您的情况下,mldivide 将使用 LU 求解器,因此应该没有区别。
-
唯一的区别是属性检查,在 linsolve 文档中说明需要一些时间
-
“据我所知,通过使用 mldivide,MATLAB 将使用 LU 分解,因为我的矩阵 A 除了正方形之外没有任何特定属性”。检查这个:uk.mathworks.com/help/matlab/ref/mldivide_full.png
-
在我的特定问题(断层扫描)中,我需要解决 1 个(或很少)
Ax=b问题与大量A矩阵。我需要做的实际上是编写我自己的基于 GPU 的算法来完成这项工作,这是解决它的唯一方法。请注意,mldivide也是内置 gpu 加速的,因此您可以使用它
标签: matlab linear-algebra