如果x
的每个元素仅包含fruit
字段的字符串,则可以通过以下方式轻松完成此操作。
toremove = ismember({x.fruit}, 'apple')
x(toremove) = [];
或者更简单地
x = x(~ismember({x.fruit}, 'apple'));
的{x.fruit}
语法结合了所有的fruit
每个struct
的值转换成一个单元阵列。然后你可以在字符串的单元阵列上使用ismember
来比较每一个到'apple'
。这将产生一个大小为x
的逻辑数组,可用于索引x
。
你也可以使用类似strcmp
而不是上面的ismember
。
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}));
这些方法对单个水果工作正常,但我有一个列表。我是否需要循环遍历单元格数组中包含的水果(即y),从x中移除每一个水果,还是有更多的'Matlab-y'方法来使用隐式循环来做到这一点? – user1245262
@ user1245262已更新以包含该用例。 – Suever