删除元胞数组 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
。
我在 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
。