关于如何从函数内部修改基本工作区结构,我现在有两种不同的实现方式。
对于我在基础工作区中的结构声明:
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 倍。有没有另一种方法可以更快地做到这一点?
最佳答案
关注 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
关于matlab - 修改结构的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21760301/