使用循环。
首先要做的事情是:只有当它实际上是一个问题时才开始担心性能,并且只有在你做对了之后。
现在,如果我对您的理解正确,这里通常有两种方法可以完成您想要的:
% create some bogus data with the same structure
% ---------------------------
f_xmllink = @(N) struct(...
'Attributes', struct(...
'Name', num2str(N))...
);
f_xmlFB = @(N) struct(...
'Attributes', struct(...
'Name', num2str(N),...
'Typ' , num2str(N))...
);
% using numbers as names
xmllink = {
f_xmllink(190)
f_xmllink(331) % 2
f_xmllink(321) % 3
f_xmllink(239)
};
xmlFB = {
f_xmlFB(331) % 1
f_xmlFB(200)
f_xmlFB(108)
f_xmlFB(321) % 4
f_xmlFB(035)
};
% Example of a no-loop approach
% ---------------------------
tic
s_exp = @(s, field) [s.(field)];
s_exp_C = @(s, field) {s.(field)};
one = s_exp_C(s_exp( [xmllink{:}], 'Attributes'), 'Name');
two = s_exp_C(s_exp( [xmlFB{:}], 'Attributes'), 'Name');
[i,j] = find(strcmp(repmat(one,numel(two),1), repmat(two,numel(one),1).'));
s_exp_C(s_exp([xmlFB{i}], 'Attributes'), 'Typ')
toc
% Example of a loop approach
% ---------------------------
tic
for ii = 1:numel(xmllink)
S = [xmlFB{:}];
S = [S.Attributes];
S = {S.Name};
ind = strmatch(xmllink{ii}.Attributes.Name, S);
if ~isempty(ind)
xmlFB{ind}.Attributes.Typ
end
end
toc
输出:
% no-loop
ans =
'331' '321' % correct findings
Elapsed time is 0.001103 seconds.
% loop
ans =
331 % correct findings
ans =
321
Elapsed time is 0.000666 seconds. % FASTER!
当然,比较性能并不是一个公平的测试,但我想每个人都会同意循环版本至少不会比非循环版本慢。
更重要的是,速度并不是一切——您花了多长时间才了解无环路解决方案?您很可能一口气就理解了循环解决方案,而无循环解决方案要复杂得多,并且必须彻底记录和测试等。此外,对无循环解决方案的更改将比在循环解决方案。
在 Matlab 中不使用循环的建议已经完全过时了。请忽略它:)