如果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