Matlab - 仅返回不包含在其他矩阵“B”中的矩阵“A”的行

时间:2014-01-09 12:05:55

标签: matlab

如何仅返回不包含某些值的矩阵“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'

提前感谢您的帮助

3 个答案:

答案 0 :(得分:3)

删除A }中包含至少一个字符串的B

花哨的单行内容包含两个嵌套cellfunsstrfind的核心:

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)