如何从Matlab数组中删除特定struct.field值的结构

时间:2016-05-17 16:26:57

标签: string matlab struct matlab-struct

每当我尝试按字段编辑结构数组时,我发现我真的需要花几周的时间来尝试真正学习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来做到这一点?

1 个答案:

答案 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