在matlab中删除2xN矩阵中的交集列

时间:2014-03-19 15:26:44

标签: matlab matrix

我在matlab中有两个矩阵A和B(大小为2xN):

A=[1 2 3 4 5 6
   7 8 9 4 1 9]

B=[7 4 3 5 1 8
   7 8 9 4 7 9]

我想通过colmun查找A和B列的交集,即我想删除上面例子的矩阵A的第1列和第3列以及第3列和第5列。有没有办法在没有循环的情况下做到这一点?是否有一个函数在matlab中执行此操作?

P.S。矩阵可以具有不同的大小,即,例如,一个可以具有2x10的大小,而另一个可以具有2x20的大小。

3 个答案:

答案 0 :(得分:3)

intersect的单次调用将获取两个数组中相交列的位置:

>> [C,IA,IB] = intersect(A',B','rows')
C =
     1     7
     3     9
IA =
     1
     3
IB =
     5
     3

删除它们(固有的稳定输出顺序):

>> A(:,IA) = []
A =
     2     4     5     6
     8     4     1     9
>> B(:,IB) = []
B =
     7     4     5     8
     7     8     4     9

或者您可以拨打setdiff两次:

>> A2 = setdiff(A.',B.','rows','stable').'
A2 =
     2     4     5     6
     8     4     1     9
>> B2 = setdiff(B.',A.','rows','stable').'
B2 =
     7     4     5     8
     7     8     4     9

答案 1 :(得分:2)

您可以使用ismember通过转置和查找两个矩阵中的匹配行来执行此操作。

A=[1 2 3 4 5 6
   7 8 9 4 1 9];

B=[7 4 3 5 1 8
   7 8 9 4 7 9];


ind_A = ~ismember(A', B', 'rows')';
ind_B = ~ismember(B', A', 'rows')';

A(:, ind_A)

ans =

     2     4     5     6
     8     4     1     9



B(:, ind_B)

ans =

     7     4     5     8
     7     8     4     9

答案 2 :(得分:1)

计算size(A,1) x size(B,2)矩阵,该矩阵告诉每列的组合是否相等(使用bsxfun)。然后使用它来选择应在AB中保留哪些列:

ind = squeeze(any(bsxfun(@ne, A, permute(B, [1 3 2])))); %// 1 if different
A = A(:,all(ind,2)); %// keep a column of A if it differs from all columns in B
B = B(:,all(ind,1)); %// keep a column of B if it differs from all columns in A