删除元胞数组 A 中位于元胞数组 B 中的所有行

Remove all rows in cell array A that are in cell array B

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

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?

这个 one-liner 应该符合您的目的:

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

输出为:

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

基本上,A 中未在 B 中找到的行元素显示 row-wise 求和值大于 0。然后使用该参考值生成逻辑索引,以捕获 B.

中不存在的元素

ismember 函数有一个很好的重载,它接受 rows 作为第三个输入参数以执行 row-wise 匹配。这确实会简化此计算,但不幸的是,元胞数组输入不支持它。

编辑

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),:);

假设没有重复的行,

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

应该做你想做的。参见documentation for setdiff