mldivide vs.(LU& linsolve)

时间:2016-12-02 09:11:19

标签: matlab linear-algebra

这个问题可能过于宽泛而无法在此发布,但我会尝试尽可能具体。如果你仍然认为它过于宽泛,我会简单地删除它。

  • 查看底部的编辑,以了解我对该主题的最终想法。
  • 如果您可以访问并行计算工具箱并拥有NVIDIA GPU,还可以查看Ander Biguri的答案。

我的问题:

我正在使用Newmark方案(二阶隐式)求解动态方程,这涉及为A*x=b求解x形式的许多线性系统。

我已经优化了所有不涉及求解线性系统的代码。就目前而言,线性系统求解过程占计算时间的70%。

我使用的是MATLAB的linsolve,但我的矩阵A没有任何属性可用作opts的{​​{1}}输入。< / p>

想法:

linsolve的文档中所示:

  

如果A在opts中具有属性,则linsolve比mldivide更快,   因为linsolve不会执行任何测试来验证A是否具有   指定的属性

据我所知,通过使用linsolve,MATLAB将使用LU分解,因为我的矩阵mldivide除了是正方形之外没有任何特定的属性。

我的问题:

所以我想知道我是否会先使用MATLAB的A分解A,然后将这些内容提供给linsolve以便用{{1}解决lu分别为上下三角形。 这样我就可以阻止MATLAB在x = U\(L\b)过程中进行所有属性检查。

注意:我绝对不希望获得巨大的时间。但是在计算上需要长达一周的时间,即使是2%也很重要。

现在我为什么不亲自尝试一下?好吧,我的计算一直运行到周二,并且我想问一下是否有人已经尝试过并节省了时间,因mldivide的矩阵属性检查而消除了开销。

玩具示例:

opts

修改

所以我有可能尝试一些事情。

我之前在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解算器,这就是我想要的。用它来做一些时间测试(并考虑到@rayryeng对“那个坏男孩”opts的评论),与LU相比,它节省了大约2~3%的处理时间,如下所示。就时间收益而言,这并不是什么大不了的事,但是在长达一周的计算中它是不可忽略的。

timeit会在mldivide线性系统上生成:

timeit

1626*1626

mldivide

 t1 =

   0.102149773097083   

亲戚: linsolve

1 个答案:

答案 0 :(得分:4)

我知道你没有NVIDIA GPU和并行计算工具箱,但如果你有,那就行了:

如果您通过以下代码替换代码中的第二个测试:

tic;

for ii=1:10
        A2=gpuArray(A); % so we account for memory management
        b2=gpuArray(b);
      x=A2\b2;
end
out2=toc;

我的电脑说(CPU与GPU)

Case 1 time per iteration :0.011881
Case 2 time per iteration :0.0052003