2014-02-13 78 views
4

我現在有兩種不同的實現方式,即如何從函數內部修改基礎工作區結構。修改結構的最快方法

用於基礎工作空間我的結構聲明:

arg = struct('aa', struct('abc',30)); 

,我測試的第一種功能使用evalin命令:

function modifyArg1(parameter, value) 
    evalin('base', [parameter '=' value ';']) 
end 

,被稱爲是這樣的:

modifyArg1('arg.aa.abc', '60') 

第二個函數的結構爲arg作爲輸入a第二輸出:

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

真的,這只是eval'如何'是做任何事情,最好避免緩慢的方式。你可以嘗試直接調用['setfield'](http://www.mathworks.co.uk/help/matlab/ref/setfield.html),但我懷疑它會有很大的不同。另外,我很難想象即使動態分配結構域的代碼也是一個重要的瓶頸。 – Notlikethat

回答

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 

這在我的測試是快了近10倍,然後執行modifyArg2功能。即使這將是比執行modifyArg2快得多(我測試):

tic 
for ii = 1 : 10000 
    parameter1 = 'aa'; 
    parameter2 = 'abc'; 
    arg.(parameter1).(parameter2) = 60;  
end 
toc