1

我有一个多行矩阵,我想删除一些矩阵行,包括属于禁止列表的第一列的名称应该被忽略。

像这样:

Product name     number      color
P1                x            red
P1                x            blue
p1                x            blue
p2                x            red
p3                x            red
p4                x            red
p4                x            green

listItemToExclude = ['p1', 'p4']

我需要得到这个结果:

Product name     number      color

p2                x            red
p3                x            red

谢谢你的帮助

4

1 回答 1

2

假设您的矩阵是一个单元格数组:

M = {'P1', 'x', 'red'; 'P1', 'x', 'blue'; 'p1', 'x', 'blue'; ...
     'p2', 'x', 'red'; 'p3', 'x', 'red'; 'p4', 'x', 'red'; 'p4', 'x', 'green'};

您可以选择所需的行ismember

>> rowsOut = M(ismember(M(:,1),{'p2','p3'}),:)
rowsOut = 
    'p2'    'x'    'red'
    'p3'    'x'    'red'

或者您可以使用strcmpiwithcellfun忽略大小写:

keyMatchFun = @(x) strcmpi(M(:,1),x);
keyMatchMasks = cellfun(keyMatchFun,{'p2','p3'},'uni',false);
rowsOut = M(any([keyMatchMasks{:}],2),:)

添加标题:

>> header = {'Product name','number','color'};
>> [header; outRows]
ans = 
    'Product name'    'number'    'color'
    'p2'              'x'         'red'  
    'p3'              'x'         'red'  

编辑:如果您从排除列表开始,例如listItemToExclude = {'p1', 'p4'};,您可以通过以下方式获取要包含的列表(忽略大小写):

uniqueProducts = unique(lower(M(:,1)));
excludeMasks = cellfun(@(x)strcmpi(uniqueProducts,x),listItemToExclude,'uni',0);
listItemToInclude = uniqueProducts(~any([excludeMasks{:}],2))' %' use above
listItemToInclude = 
    'p2'    'p3'
于 2013-11-14T19:05:25.170 回答