matlab计算eval很慢,matlab – 与`str2func`相比较的`eval`的性能,用于从字符串中计算函数...

简短回答:使用str2func.

基准

基准测试将评估N个不同x值的函数.

f='a^x+exp(b)+sin(c*x)+d';

Ns = linspace(1, 1000, 20);

timeEval = zeros(size(Ns));

timeEvalHandle = zeros(size(Ns));

timeStr2func = zeros(size(Ns));

for i=1:length(Ns)

N = Ns(i);

timeEval(i) = timeit(@() useEval(f, N));

timeEvalHandle(i) = timeit(@() useEvalHandle(f, N));

timeStr2func(i) = timeit(@() useStr2func(f, N));

end

figure

plot(Ns, timeEval, 'DisplayName', 'time eval');

hold on

plot(Ns, timeEvalHandle, 'DisplayName', 'time eval');

hold on

plot(Ns, timeStr2func, 'DisplayName', 'time str2func');

legend show

xlabel('N');

figure

plot(Ns, timeEval./timeStr2func, 'DisplayName', 'time_{eval}/time_{str2func}');

hold on

plot(Ns, timeEvalHandle./timeStr2func, 'DisplayName', 'time_{eval handle}/time_{str2func}');

legend show

xlabel('N');

figure

plot(Ns, timeEvalHandle./timeStr2func);

ylabel('time_{eval handle}/time_{str2func}')

xlabel('N');

function y = useEval(f, N)

a = 1; b = 2; c = 3; d = 4;

for x=1:N

y = eval(f);

end

end

function y = useEvalHandle(f, N)

a = 1; b = 2; c = 3; d = 4;

fHandle = eval(['@(x, a, b, c, d) ' f]);

for x=1:N

y = fHandle(x, a, b, c, d);

end

end

function y = useStr2func(f, N)

a = 1; b = 2; c = 3; d = 4;

fHandle = str2func(['@(x, a, b, c, d) ' f]);

for x=1:N

y = fHandle(x, a, b, c, d);

end

end

zPKLWm.png

vZMSim.png

6D8qRm.png

str2func vs eval(没有函数句柄):结果显示,即使对函数进行一次评估,使用str2func比使用eval(没有函数句柄)快约50%.对于大量的评估,str2func可能快约100倍(取决于您正在评估的功能).

str2func vs eval(带有函数句柄):对于单个评估,eval比str2func慢约100%,但对于大量评估,eval几乎同样快(eval慢约5%).

使用和不使用函数句柄的eval:请注意,对于单个评估,使用eval创建函数句柄比直接评估它慢约50%.

结论:str2func总是比eval快.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值