这个问题可能过于宽泛而无法在此发布,但我会尝试尽可能具体。如果你仍然认为它过于宽泛,我会简单地删除它。
我正在使用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
答案 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