ループを使用します。
まず最初に: パフォーマンスが実際に問題になったときにのみ、パフォーマンスについて心配し始めてください。
さて、私があなたを正しく理解していれば、あなたが望むことを達成するための一般的な2つの方法があります:
% 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!
確かに、パフォーマンスを比較するのは公正なテストではありませんが、ループ バージョンが非ループ バージョンよりも遅くなることはないと誰もが同意すると思います。
さらに重要なことは、速度がすべてではないということです。ノーループ ソリューションを理解するのにどのくらいの時間がかかりましたか? ループ ソリューションは 1 回の読み取りで理解できる可能性がありますが、ループのないソリューションははるかに複雑であり、徹底的に文書化してテストする必要があります。また、ループのないソリューションへの変更は、ループ ソリューション。
Matlab でループを使用しないというアドバイスは完全に時代遅れです。無視してください:)