如何仅返回不包含某些值的矩阵“A”的行 (这些值是数组'B')?
A = {'A1', 5 'P01,P02,P03,P04';
'A2' 7, 'P08,P09';
'A3' 8, 'P07';
'A4' 8, 'P10,P11'};
B = { 'P07'; 'P10'; 'P11'};
我只需要返回:
'A1'
'A2'
提前感谢您的帮助
答案 0 :(得分:3)
删除A
1>}中包含至少一个字符串的B
行
花哨的单行内容包含两个嵌套cellfuns
和strfind
的核心:
A(all(cell2mat(cellfun(@(b) cellfun(@isempty, strfind(A(:,end),b)).',B, 'uni', 0))),1)
也许计算为中间结果的逻辑指数是有意义的:
ind = cell2mat(cellfun(@(b) cellfun(@isempty, strfind(A(:,end),b)).',B, 'uni', 0));
A(all(ind),1)
即~ind
告诉您哪些B
字符串包含在A
的哪些行中。在示例中,
>> ~ind
ans =
0 0 1 0
0 0 0 1
0 0 0 1
工作原理:strfind
测试B
的每个字符串是否在A
中,并返回具有相应位置的向量。因此空向量表示该字符串不存在。如果该矢量对于B
的所有字符串都为空,则应选择该行A
。
答案 1 :(得分:2)
路易斯主题的变化:
ind = A( all(cellfun('isempty', ...
cellfun(@strfind, ...
repmat(A(:,end), 1,size(B,1)), ...
repmat(B', size(A,1),1), 'UniformOutput', false)), 2), 1)
有点违背我自己的期望,这比路易斯的解决方案快很多。我认为这主要是由于字符串函数与匿名函数(cellfun
使用字符串函数比使用匿名函数要快得多)。 cell2mat
不是内置的也是一个因素。
答案 2 :(得分:1)
我建议您更改A
中数据的存储方式,如下所示:
A = {'A1', 5, {'P01','P02','P03','P04'};
'A2', 7, {'P08','P09'};
'A3', 8, {'P07'};
'A4', 8, {'P10','P11'}};
B = {'P07'; 'P10'; 'P11'};
然后你可以这样做:
for n = 1:size(A,1)
ind(n) = ~sum(ismember(B,A{n,3}));
end
A(ind,1)
或者,如果你更喜欢一个班轮,那么:
A(cellfun(@(x)(~sum(ismember(B,x))), A(:,3)),1)