35

長さの異なるベクトルである多くのフィールドを持つ構造があります。ループ内のフィールドに順番にアクセスしたいと思います。次のようにgetfieldを試しましたが、MATLABはそれを好みません。これどうやってするの?

S = struct('A', [1 2], 'B',[3 4 5]);
SNames = fieldnames(S);
for loopIndex = 1:2
  field = getfield(S, SNames(loopIndex));
  %do stuff w/ field
end
??? Index exceeds matrix dimensions

配列ではフィールドの長さが異なると問題が発生するため、最初に構造体を使用しています。それに代わるより良い方法はありますか?

4

6 に答える 6

46

stuff を定義する行に見られるように、括弧内に文字列を入れる動的フィールド参照を試してください。

S = struct('A', [1 2], 'B',[3 4 5]); 
SNames = fieldnames(S); 
for loopIndex = 1:numel(SNames) 
    stuff = S.(SNames{loopIndex})
end 

私はスティーブとアダムに同意します。セルを使用します。ただし、この構文は、他の状況の人々に適しています!

于 2009-12-10T16:31:45.903 に答える
16

ここで言いたいことが3つあります。

  • 上記のコードでエラーが発生する理由は、インデックス作成の方法が原因ですSNames。この関数は文字列のセル配列fieldnamesを返すため、文字列値にアクセスするにはコンテンツのインデックス付け(中括弧)を使用する必要があります。コードの4行目を次のように変更した場合:

    field = getfield(S, SNames{loopIndex});
    

    そうすれば、コードはエラーなしで機能するはずです。

  • MatlabDougが提案しているように、動的フィールド名を使用して、使用する必要をなくすことができますgetfield(私の意見では、よりクリーンなコードが生成されます)。

  • 構造体の代わりにセル配列を使用するというAdamからの提案は、まさにその通りです。これは通常、長さの異なる一連の配列を1つの変数に収集するための最良の方法です。コードは次のようになります。

    S = {[1 2], [3 4 5]};        % Create the cell array
    for loopIndex = 1:numel(S)   % Loop over the number of cells
      array = S{loopIndex};      % Access the contents of each cell
      % Do stuff with array
    end
    
于 2009-12-10T18:26:34.360 に答える
5

getfield アプローチは問題ありません (ただし、現在 MATLAB を利用できないため、上記が機能しない理由は明らかではありません)。

別のデータ構造については、MATLAB cell 配列を調べることもできます。また、さまざまな長さのベクトルを格納してインデックス付けすることもできます。

于 2009-12-10T16:11:05.040 に答える
2

コロン表記を使用して、インデックスを回避できます。

S = struct('A', [1 2], 'B',[3 4 5]); 
SNames = fieldnames(S); 
for SName = [SNames{:}]
    stuff = S.(SName)
end
于 2012-12-03T15:31:24.740 に答える
2

私が見つけた非常にうまく機能する構造を使用する必要がある場合は、最初にセルに変換すると、両方の長所が得られます。

S = struct('A', [1 2], 'B',[3 4 5]); 
S_Cell = struct2cell(S);
%Then as per gnovice
for loopIndex = 1:numel(S_Sell)   % Loop over the number of cells
    array = S{loopIndex};         % Access the contents of each cell
    %# Do stuff with array
end

構造体で生成されたものに似たものを使用し、マトリックスのようにアクセスする必要がありました。その場合、それは次のように単純でした

M = cell2mat(struct2cell(S));

マトリックスに変換するには

于 2013-03-18T14:02:41.423 に答える