2

構造を持つ2つのセル配列があります。

例:

xmlFB =
1列目から5列目
[1x1構造体] [1x1構造体] [1x1構造体] [1x1構造体] [1x1構造体]

xmllink = 1列目から3列目 [1x1 構造体] [1x1 構造体] [1x1 構造体]

xmlFB{1} ans =

Param: {[1x1 struct] [1x1 struct]} InterChartConnection: [1x1 struct] Tasks: [1x1 struct] Attributes: [1x1 struct] xmllink{1} ans = Attributes: [1x1 struct]

xmllink」には構造体「Attributes 」があり、値「EN1」を持つフィールド「Name 」があります

そして、構造体「属性」のxmlFBには、 「名前」と「タイプ」の2つのフィールドがあります

名前はユニークです。

私がやりたいことは、「 xmllink 」の名前から「 xmlFB 」の「Typ見つけることです。

最初にループを使いたかったのですが、Matlab からこれらの arrayfun/structfun/cellfun 関数について読みました。

これらでこれを行う方法はありますか?それともループの方がいいですか?

4

2 に答える 2

1

ループを使用します。

まず最初に: パフォーマンスが実際に問題になったときにのみ、パフォーマンスについて心配し始めてください。

さて、私があなたを正しく理解していれば、あなたが望むことを達成するための一般的な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 でループを使用しないというアドバイスは完全に時代遅れです。無視してください:)

于 2013-04-09T15:01:32.983 に答える