Matlab 合并两个三列矩阵:cols1&;2,第3列中的最大值

Matlab 合并两个三列矩阵:cols1&;2,第3列中的最大值,matlab,matrix,merge,unique,set-union,Matlab,Matrix,Merge,Unique,Set Union,我有两个矩阵: 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中轻松实现这一点的建议都将不胜感激。我在试图使用interse

我有两个矩阵:

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时把头撞在墙上,但没有用。

阅读有关unique的内容


合并数组时,应确保它们最终排序(按col1、col2、col3)。幸运的是,
union
函数正好做到了这一点

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


您还可以混合使用
unique
accumarray

  • 使用
    unique
    根据前两列创建索引
  • 使用
    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)]

这对intersect有什么帮助?您的结果与OP.Brilliant的预期结果不匹配!我知道有比尴尬的
更简单的方法,因为我想出了if
解决方案!;)
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));
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)]