0

我有两个矩阵:

a = [ 1 10 20; 2 11 22; 3 12 34; 4 13 12];
b = [ 3 12 1;  4 13 25; 5 14 60; 6 15 9 ];

我想将它们合并到一个矩阵中,其中第 3 列中具有最大值的行在第 1 列和第 2 列相同的情况下使用,即生成的矩阵应如下所示:

 c = [ 1 10 20; 2 11 22; 3 12 34; 4 13 25; 5 14 60; 6 15 9];

任何如何在 MATLAB 中轻松做到这一点的建议将不胜感激。我试图用头撞到墙上,intersect但无济于事。

4

3 回答 3

0

合并数组时,您应该确保它们最终排序(按 col1 然后 col2 然后 col3)。幸运的是,该union函数正是这样做的。

在您的示例中,第一列和第二列中的值始终是唯一的,我们只能观察第一列中的值来选择正确的行。当diff返回一个非零值时会发生这种情况(这意味着这是一组的底行):

a = [ 1 10 20; 2 11 22; 3 12 34; 4 13 12];
b = [ 3 12 1;  4 13 25; 5 14 60; 6 15 9];
c = [ 1 10 20; 2 11 22; 3 12 34; 4 13 25; 5 14 60; 6 15 9 ];

u = union(a,b,'rows');               % this merges and sorts the arrays
r = u(logical([diff(u(:,1)); 1]),:); % since the array is sorted, the last entry will have 
                                     % the maximum value in column 3
assert(isequal(r,c));
于 2018-05-23T07:40:58.027 回答
0

您还可以使用 和 之间的unique混合accumarray

  • 用于unique基于前 2 列创建索引
  • 用于accumarray根据索引查找第三列中的最大值。

编码:

a = [ 1 10 20;2 11 22; 3 12 34; 4 13 12];
b = [3 12 1; 4 13 25; 5 14 60; 6 15 9];

M = [a;b];
[res,~,ind] = unique(M(:,1:2),'rows');
c  = [res,accumarray(ind,M(:,3),[],@max)]
于 2018-05-23T08:18:30.700 回答
-1

阅读独特的

a = [ 1 10 20;2 11 22; 3 12 34; 4 13 12];
b = [3 12 1; 4 13 25; 5 14 60; 6 15 9];

A = [a;b] ;
[c,ia,ib] = unique(A(:,1)) ;

C = A(ia,:)
于 2018-05-23T06:37:06.137 回答