首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab -只返回矩阵'A‘中不包含在其他矩阵'B’中的行。

Matlab -只返回矩阵'A‘中不包含在其他矩阵'B’中的行。
EN

Stack Overflow用户
提问于 2014-01-09 12:05:55
回答 3查看 136关注 0票数 1

如何只返回不包含某些值的矩阵'A‘的行(这些值​​是数组'B')?

代码语言:javascript
复制
  A = {'A1',  5  'P01,P02,P03,P04'; 
        'A2'  7,  'P08,P09';
        'A3'  8,  'P07';
        'A4'  8,  'P10,P11'};

    B = { 'P07'; 'P10'; 'P11'};

我只需要返回:

代码语言:javascript
复制
'A1'
'A2'

提前感谢您的帮助

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-09 12:23:04

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

想象一下以两个嵌套的cellfunsstrfind为核心的一行:

代码语言:javascript
复制
A(all(cell2mat(cellfun(@(b) cellfun(@isempty, strfind(A(:,end),b)).',B, 'uni', 0))),1)

也许作为中间结果计算的逻辑指数是有意义的:

代码语言:javascript
复制
ind = cell2mat(cellfun(@(b) cellfun(@isempty, strfind(A(:,end),b)).',B, 'uni', 0));
A(all(ind),1)

也就是说,~ind告诉您B的哪些字符串包含在A的哪些行中。在这个例子中,

代码语言:javascript
复制
>> ~ind
ans =
     0     0     1     0
     0     0     0     1
     0     0     0     1

如何工作:strfind测试B的每个字符串是否在A中,并返回一个带有相应位置的向量。因此,空向量意味着字符串不存在。如果该向量对于B的所有字符串都是空的,则应该选择这一行A

票数 3
EN

Stack Overflow用户

发布于 2014-01-09 13:27:28

路易斯主题的变奏曲:

代码语言:javascript
复制
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没有内置也是一个因素。

票数 2
EN

Stack Overflow用户

发布于 2014-01-09 12:23:17

我建议您按照以下方式更改A中数据的存储方式:

代码语言:javascript
复制
A = {'A1',  5,  {'P01','P02','P03','P04'}; 
     'A2',  7,  {'P08','P09'};
     'A3',  8,  {'P07'};
     'A4',  8,  {'P10','P11'}};

B = {'P07'; 'P10'; 'P11'};

然后你就可以:

代码语言:javascript
复制
for n = 1:size(A,1)
    ind(n) = ~sum(ismember(B,A{n,3}));
end

A(ind,1)

或者如果你喜欢一个班轮,那么:

代码语言:javascript
复制
A(cellfun(@(x)(~sum(ismember(B,x))), A(:,3)),1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21019774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档