首页 > 解决方案 > 在 Matlab 中拆分长命令以提高速度

问题描述

我有 2 个函数,它们计算ax^2+bx+c具有较小绝对值的函数的根(a, b, c,x是向量):

function x = minroot(a,b,c)
% f1
d = sqrt(b.*b-4*a.*c);
x = (-2*c)./(b+sign(b).*d);

和:

function x = minroot(a,b,c)
% f2
x = (-2*c)./(b+sign(b).*sqrt(b.*b-4*a.*c));

如您所见,它们之间的唯一区别是在f1变量d中是单独计算的。

令我惊讶的是,我注意到它的f1工作速度始终更快(大约快 5%)。

你能告诉我为什么f1工作得更快,我什么时候应该拆分我的命令以使程序更快?


测试代码:

function t = test()
a = rand(10000000,1);
b = rand(10000000,1);
c = rand(10000000,1);

x = minroot1(a,b,c);
y = minroot2(a,b,c);
assert(all(abs(x-y)./abs(x) < 1e-9))

t1 = timeit(@()minroot1(a,b,c));
t2 = timeit(@()minroot2(a,b,c));

t = t2/t1;
end

function x = minroot1(a,b,c)
d = sqrt(b.*b-4*a.*c);
x = (-2*c)./(b+sign(b).*d);
end

function x = minroot2(a,b,c)
x = (-2*c)./(b+sign(b).*sqrt(b.*b-4*a.*c));
end

标签: matlaboptimization

解决方案


推荐阅读