5

次の問題に直面しています。次のような構造の配列があります。

A.B(1,1).x = 'string'
A.B(1,1).y = 12
A.B(1,2).x = []
A.B(1,2).y = []
A.B(1,3).x = 'string2'
A.B(1,3).y = 4

2. この構造から空の行を削除して、最終的に (1,1) と (1,3) のフィールドを取得したいと思います。セルに変換し、削除してから構造に戻そうとしましたが、この方法ではフィールドの名前を再入力する必要がありました。どうすればそれが可能ですか?構造体からの変換なしで実行できますか?

ティア!

4

1 に答える 1

2

ループまたはarrayfunを使用して、空の配列要素を特定します。

empty_elems = arrayfun(@(s) isempty(s.x) & isempty(s.y),A.B)

戻り値:[0 1 0]

また

empty_elems = arrayfun(@(s) all(structfun(@isempty,s)), A.B);

これは、すべてのフィールドが空かどうかをチェックします ( allの代わりにanyを使用して、すべての代わりに空の要素があるかどうかをチェックします)。

次に、論理インデックスを使用してそれらを削除します。

A.B(empty_elems) = [];

コメントであなたの問題に対する完全な解決策:

% find array elements that have all fields empty:
empty_elems = arrayfun(@(s) all(structfun(@isempty,s)), A.B);

% copy non-empty elements to a new array `C`:
C = A.B(~empty_elems);

% find elements of C that have y field >3
gt3_elems = arrayfun(@(s) s.y<3,C);

% delete those form C:
C(gt3_elems) = [];

このコードを段階的に実行し、中間変数を分析して何が起こっているのかを理解してください。それはかなり明確なはずです。

于 2012-08-08T14:04:16.640 に答える