删除单元阵列A中单元阵列B中的所有行

时间:2018-04-07 23:25:39

标签: matlab difference cell-array

我在A中有一个单元格数组MATLAB,如下所示

A = { 'U2', 'T13', 'A52';  
      'U2', 'T15', 'A52';  
      'U2', 'T18', 'A52';  
      'U2', 'T17', 'A995'; 
      'U4', 'T18', 'A53';  
      'U4', 'T13', 'A64';  
      'U4', 'T18', 'A64';
    }

我还有一个单元格数组B如下:

B = { 'U2', 'T13', 'A52';  
      'U2', 'T18', 'A52';   
      'U4', 'T13', 'A64';  
      'U4', 'T18', 'A64';
     }

如何生成单元格数组C等于A - B

C = { 'U2', 'T15', 'A52';  
      'U2', 'T17', 'A995'; 
      'U4', 'T18', 'A53';  
    }

如何获得C

2 个答案:

答案 0 :(得分:1)

此单行应符合您的目的:

C = A(sum(~ismember(A,B),2) > 0,:)

输出结果为:

C =
    3×3 cell array
    'U2'    'T15'    'A52' 
    'U2'    'T17'    'A995'
    'U4'    'T18'    'A53'

基本上,A中未找到的B的行元素显示的行总和值大于0。然后,该参考值用于生成捕获B中不存在的元素的逻辑索引。

ismember函数有一个很好的重载,它接受rows作为第三个输入参数,以便执行逐行匹配。这将真正简化此计算,但不幸的是,单元数组输入不支持它。

修改

A = {
  'U2' 'T13' 'A52';  
  'U2' 'T15' 'A52';  
  'U2' 'T18' 'A52';  
  'U2' 'T17' 'A995'; 
  'U4' 'T18' 'A53';  
  'U4' 'T13' 'A64';  
  'U4' 'T18' 'A64'
};

B = {
  'U2' 'T13' 'A52';  
  'U2' 'T18' 'A52';   
  'U4' 'T13' 'A64';  
  'U4' 'T18' 'A64'
};

A_len = size(A,1);
A_keys = cell(A_len,1);

for i = 1:A_len
    A_keys{i} = horzcat(A{i,:});
end

B_len = size(B,1);
B_keys = cell(B_len,1);

for i = 1:B_len
    B_keys{i} = horzcat(B{i,:});
end

C = A(~ismember(A_keys,B_keys),:);

答案 1 :(得分:1)

假设没有重复的行,

C = setdiff(A,B,'rows');

应该做你想做的事。请参阅documentation for setdiff