我在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的大小。
答案 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
)。然后使用它来选择应在A
和B
中保留哪些列:
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