【问题标题】:Merging two three column matrices: uniques in cols 1&2, maximum in col 3合并两个三列矩阵:第 1 列和第 2 列中的唯一值,第 3 列中的最大值
【发布时间】:2018-11-02 00:29:29
【问题描述】:

我有两个矩阵:

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 将头撞到墙上,但无济于事。

【问题讨论】:

    标签: matlab matrix merge unique set-union


    【解决方案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,:)
    

    【讨论】:

    • 这对相交有什么帮助?
    • 您的结果与 OP 的预期结果不符。
    【解决方案2】:

    在合并数组时,您应该确保它们最终排序(按 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));
    

    【讨论】:

    • 太棒了!我知道有比我想出的令人尴尬的for-if 解决方案更简单的方法! ;)
    【解决方案3】:

    您还可以混合使用 uniqueaccumarray

    • 使用 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-06-13
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多