修改结构的最快方法

时间:2014-02-13 16:45:56

标签: matlab optimization structure

我现在有两种不同的实现,如何从函数内部修改基础工作区结构。

对于我在基础工作区中的结构声明:

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倍。还有另一种方法可以更快地完成吗?

1 个答案:

答案 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