如何只返回不包含某些值的矩阵'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'提前感谢您的帮助
发布于 2014-01-09 12:23:04
删除包含A 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。
发布于 2014-01-09 13:27:28
路易斯主题的变奏曲:
ind = A( all(cellfun('isempty', ...
cellfun(@strfind, ...
repmat(A(:,end), 1,size(B,1)), ...
repmat(B', size(A,1),1), 'UniformOutput', false)), 2), 1)有点违背我自己的期望,这比路易斯的解决方案快得多。我认为这主要是由于string函数与匿名函数(cellfun使用字符串函数比使用匿名函数快得多)。cell2mat没有内置也是一个因素。
发布于 2014-01-09 12:23:17
我建议您按照以下方式更改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)https://stackoverflow.com/questions/21019774
复制相似问题