の各要素にフィールドx
の文字列のみが含まれているfruit
場合は、次の方法で簡単に行うことができます。
toremove = ismember({x.fruit}, 'apple')
x(toremove) = [];
またはもっと簡単に
x = x(~ismember({x.fruit}, 'apple'));
この{x.fruit}
構文は、fruit
for eachのすべての値をstruct
セル配列に結合します。次に、文字列のセル配列で を使用ismember
して、それぞれを と比較でき'apple'
ます。x
これにより、へのインデックス付けに使用できるのサイズの論理配列が生成されx
ます。
strcmp
上記の代わりに次のようなものを使用することもできますismember
。
x = x(~strcmp({x.fruit}, 'apple'));
アップデート
それぞれx(k).fruit
に cell 配列が含まれている場合は、上記のアプローチと同様のアプローチを と組み合わせて使用できます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}));