matlab - 在 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
解决方案
推荐阅读
- javascript - HTML5:操作 16 位 tiff 图像
- mysql - 按 rand 限制和排序 - 分组
- design-patterns - 使用多个装饰器时如何实现装饰器模式
- flutter - FLUTTER 中的小部件与属性的值
- java - 如何从 ND4j 中的 NDArray 中选择给定的一组索引,类似于 numpy 的 arraydata[arrayIndex]?
- python - 通过进行 N 次交换生成所有可能的组合
- json - 通过 MQTT 接收 JSON 文件
- c# - 玩家通过 x 轴上的触摸输入移动但不影响其他轴
- flutter - 如何使用 Flutter 访问多页 API?
- apache-spark - 如何使用 Spark Streaming 更新 parquet 文件?