每当我尝试按字段编辑结构数组时,我发现我真的需要花几周的时间来尝试真正学习Matlab。现在,我有一个结构数组,其中每个结构都有以下行的字段:
x.fruit, x.color, x.season, x.source, x.flibbertigibbet
这些字段中的每一个都是一个字符串。我还有一个字符串的单元格数组:
y = {'apple','banana','palm of granite'}
我想删除x.fruit在y中的所有结构(例如x.fruit =='apple'),但除了循环遍历y之外,似乎无法找到其他方法。
我希望有类似的内容:
bad_idx = [x(:).fruit in y];
x(bad_idx) = [];
这可行吗?有没有办法使用cellfun来做到这一点?
答案 0 :(得分:1)
如果x
的每个元素只包含fruit
字段的字符串,则可以通过以下方式轻松完成此操作。
toremove = ismember({x.fruit}, 'apple')
x(toremove) = [];
或者更简单
x = x(~ismember({x.fruit}, 'apple'));
{x.fruit}
语法将每个fruit
的{{1}}的所有值组合到一个单元格数组中。然后,您可以在字符串的单元格数组上使用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