2016-05-17 30 views
0

フィールドごとに構造体の配列を編集するたびに、実際に数週間かかることがあり、Matlabを実際に学習する必要があることがわかります。今、私は構造体の配列を持っています。各構造体には、次の行に沿ってフィールドがあります。特定のstruct.field値のためにMatlab配列から構造体を削除する方法

x.fruit, x.color, x.season, x.source, x.flibbertigibbet 

これらのフィールドはそれぞれ文字列です。

Y = {「りんご」、「バナナ」、「花崗岩の手のひら」}

Iはx.fruitをyにあるすべての構造体を削除したい(EGX:私はまた、文字列のセル配列を有します果物== 'リンゴ')、しかし、これを行う方法は、yをループする以外の方法では見つからないようです。

bad_idx = [x(:).fruit in y]; 
x(bad_idx) = []; 

これはなんとかです:

私はの線に沿って何かを期待していましたか?これを行うためにcellfunを使用するのはどこかありますか?

答えて

1

xの各要素にfruitフィールドの文字列しか含まれていない場合は、次のように簡単に行うことができます。

toremove = ismember({x.fruit}, 'apple') 
x(toremove) = []; 

以上簡潔

x = x(~ismember({x.fruit}, 'apple')); 

{x.fruit}構文は、セル配列にそれぞれstructためfruitの値のすべてを組み合わせます。文字列のセル配列にismemberを使用して、それぞれを'apple'と比較することができます。これにより、xのインデックスに使用できる論理的な配列xが生成されます。

ismemberの代わりにstrcmpのようなものを使用することもできます。

x = x(~strcmp({x.fruit}, 'apple')); 

更新

x(k).fruitがセルアレイを含んでいる場合は、cellfun組み合わせる上記のアプローチと同様のアプローチを使用することができます。

x(1).fruit = {'apple', 'orange'}; 
x(2).fruit = {'banana'}; 
x(3).fruit = {'grape', 'orange'}; 

x = x(~cellfun(@(fruits)ismember('apple', fruits), {x.fruit})); 

%// 1 x 2 struct array with fields: 
%//  fruit 

複数のタイプの果物が一度に削除されるかどうか確認する場合は、次のようにします。

%// Remove if EITHER 'apple' or 'banana' 
tocheck = {'apple', 'banana'}; 
x = x(~cellfun(@(fruits)any(ismember({'apple', 'banana'}, fruits)), {x.fruit})); 

%// Remove if BOTH 'apple' and 'banana' in one 
x = x(~cellfun(@(fruits)all(ismember({'apple', 'banana'}, fruits)), {x.fruit})); 
+0

これらのメソッドは1つの果物でうまく機能しますが、それらのリストがあります。私は自分のセル配列(y)に含まれる果物をループする必要がありますか、それぞれからxを取り除く必要がありますか、暗黙のループでこれを行うための「Matlab-y」方法がありますか? – user1245262

+0

@ user1245262このユースケースを含むように更新されました。 – Suever

関連する問題