我现在有两种不同的实现,如何从函数内部修改基础工作区结构。
对于我在基础工作区中的结构声明:
arg = struct('aa', struct('abc',30));
我测试的第一个函数使用evalin
命令:
function modifyArg1(parameter, value)
evalin('base', [parameter '=' value ';'])
end
并且这样称呼:
modifyArg1('arg.aa.abc', '60')
第二个函数的结构为arg
作为输入和输出:
function [arg] = modifyArg2(arg, parameter1, parameter2, value)
arg.(parameter1).(parameter2) = value;
end
并且这样称呼:
[arg] = modifyArg2(arg, 'aa', 'abc', 60);
我测试了两个函数以查看哪一个是最快的:
tic
for ii = 1 : 10000
[arg] = modifyArg2(arg, 'aa', 'abc', 60);
end
toc
tic
for ii = 1 : 10000
modifyArgIn1('arg.aa.abc', '60');
end
toc
Elapsed time is 0.141994 seconds.
Elapsed time is 0.677188 seconds.
因此,第二个功能几乎快了5倍。还有另一种方法可以更快地完成吗?
答案 0 :(得分:1)
关注modifyArg2
,因为这是您示例中最快的方式。获得的时间与arg.(parameter1).(parameter2) = value;
的执行无关,但与执行函数modifyArg2
无关。如果您想更快地完成它,一种方法是在循环中使用arg.(parameter1).(parameter2) = value;
内联。例如:
parameter1 = 'aa';
parameter2 = 'abc';
tic
for ii = 1 : 10000
arg.(parameter1).(parameter2) = 60;
end
toc
在我的测试中,这比执行modifyArg2
函数快了近10倍。即使这比执行modifyArg2
(我测试的)快得多:
tic
for ii = 1 : 10000
parameter1 = 'aa';
parameter2 = 'abc';
arg.(parameter1).(parameter2) = 60;
end
toc