2

MATLAB に構造体配列があるとします。

a= struct('a1',{1,2,3},'a2',{4,5,6})

構造体の要素を効率的に (つまり、ベクトル化されたコードで) フィルタリングして、ブール型のプロパティを満たすにはどうすればよいですか?

例えば:

  1. 要素が 3 の倍数であり、3 の倍数でbあるサブセットでaある新しい構造体配列を作成するにはどうすればよいですか? 期待される結果は、要素 を持つサイズ 1 の構造体配列です。 a1 a2struct('a1', 3, 'a2', 6)
  2. 要素が奇数または3 の倍数のbサブセットでaある新しい構造体配列を作成するにはどうすればよいですか? 期待される結果は、次のサイズ 2 の構造体配列です。a1 a2struct('a1', {1,3}, 'a2', {4,6})
4

1 に答える 1

3

この問題は、mod(...) 関数と括弧と参照を適切に使用することで解決できます。検討

  1. Mod(x,3)数値が 3 の倍数の場合は 0 を返しますmod(x,2)。x が奇数の場合は 1 を返します。
  2. と入力すると、ベクトル内のすべてのa1または値を取得できます。a.a1 と入力するだけでめちゃくちゃになります。a2[a.a1]
  3. 書くことによって、または同じ結果を得るために書くことによって、あなたのa構造から私たちをフィルタリングすることができます。a = a([1 3]);a = a(logical([1 0 1]))
  4. 論理 and&を 論理 orに使用できます(こちらを参照)。|

全体として、次のコードで問題が解決します。

%% Part 1:
a= struct('a1',{1,2,3},'a2',{4,5,6});
logForA1isMod3 = (mod([a.a1], 3) == 0);
logForA2isMod3 = (mod([a.a2], 3) == 0);

a = a(logForA1isMod3  & logForA2isMod3);

%% Part 2:
a= struct('a1',{1,2,3},'a2',{4,5,6});
logForA1isOdd = (mod([a.a1], 2) == 1);

a = a(logForA1isOdd | logForA2isMod3);
于 2012-06-28T18:20:02.793 に答える