这个问题可能太宽泛了,不能在这里发布,但我会尽量具体。如果您仍然认为它太宽泛,我将简单地将其删除。
我的问题 :
我正在使用 Newmark 方案(二阶隐式)求解动态方程,这涉及为
A*x=b
求解许多 x
形式的线性系统。我已经优化了所有不涉及求解线性系统的代码。就目前而言,线性系统求解在此过程中占用了多达 70% 的计算时间。
我虽然使用 MATLAB 的
linsolve
,但我的矩阵 A
没有任何可用作 opts
的 linsolve
输入的属性。想法:
如
linsolve
的文档所示:据我所知,通过使用
mldivide
,MATLAB 将使用 LU 分解,因为我的矩阵 A
除了方形之外没有任何特定属性。我的问题 :
所以我想知道我是否会通过首先使用 MATLAB 的
A
分解 lu
来获得一些时间,然后将它们提供给 linsolve 以便用 x = U\(L\b)
分别是上三角和下三角来求解 opts
。这样我会阻止 MATLAB 执行在
mldivide
过程中发生的所有属性检查。注意: 我绝对不期望获得巨大的时间 yield 。但在长达一周的计算中,即使是 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
that bad boy”的评论),与 mldivide
相比,它节省了大约 2~3% 的处理时间,如下所示。就时间增益而言,这不是什么大问题,但在长达一周的计算中,这是不可忽视的。timeit
在 1626*1626
线性系统上的结果:mldivide
: t1 =
0.102149773097083
linsolve
:t2 =
0.099272037768204
亲戚:
0.028171725121151
最佳答案
我知道您没有 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 vs GPU)
Case 1 time per iteration :0.011881
Case 2 time per iteration :0.0052003
关于matlab - mldivide 与(LU 和 linsolve),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40928442/