合并两个三列矩阵:第 1 列和第 2 列中的唯一项,第 3 列中的最大值
Merging two three column matrices: uniques in cols 1&2, maximum in col 3
我有两个矩阵:
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
但无济于事。
了解独一无二
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,:)
合并数组时,您应该确保它们最终排序(先是 col1,然后是 col2,然后是 col3)。幸运的是,union
函数正是这样做的。
在您的示例中,第 1 列和第 2 列中的值始终是唯一的,我们只能观察第 1 列中的值来选择正确的行。当 diff
returns 为非零值(这意味着这是组的底行)时会发生这种情况:
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));
您也可以混合使用 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)]
我有两个矩阵:
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
但无济于事。
了解独一无二
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,:)
合并数组时,您应该确保它们最终排序(先是 col1,然后是 col2,然后是 col3)。幸运的是,union
函数正是这样做的。
在您的示例中,第 1 列和第 2 列中的值始终是唯一的,我们只能观察第 1 列中的值来选择正确的行。当 diff
returns 为非零值(这意味着这是组的底行)时会发生这种情况:
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));
您也可以混合使用 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)]