【问题标题】:Grouping matrix rows in terms of one column根据一列对矩阵行进行分组
【发布时间】:2013-02-16 00:59:18
【问题描述】:

首先,我很难将问题描述得很好,但我会尝试。

假设我们有矩阵 A

A = [23 1;
     45 1
     78 1
     86 1
     98 2
     1  2
     23 2
     14 3
     15 4
     85 4]

我想要的输出是

    B{1} = [23,45,78,86]
    B{2} = [98,1,23]
    B{3} = [14]
    B{4} = [15,85]

请记住,原来的 A 是一个巨大的矩阵,我不想用 for 循环来做这个。我想使用使用并行处理的函数。

【问题讨论】:

    标签: matlab matrix parallel-processing grouping cell


    【解决方案1】:

    你可以在这里使用accumarray

    B = accumarray(A(:,2),A(:,1),[],@(x){x},{});
    

    如果您知道A 已排序,并且第二列没有遗漏条目,您也可以使用mat2cell

    counts = histc(A(:,2),unique(A(:,2)));
    B = mat2cell(A(:,1),counts);
    

    【讨论】:

    • 嗨,如果您因为缺少一个条目而不能使用选项#2,但您想复制 A 中的所有列而不是第一列,那么不能使用 accumarray 怎么办?跨度>
    • @Jake:你绝对可以使用accumarrayB = accumarray(A(:,2),(1:size(A,1))',[],@(x){A(x,:)},{});。诀窍是将索引向量传递给累加器。
    • 这会产生矩阵而不是元胞数组吗?
    • @Jake:不,匿名函数中的大括号可以防止这种情况发生。
    【解决方案2】:

    这是一个简单的方法。它使用循环,但应该很快,因为元胞数组B 是使用反向索引技巧预先分配的。

    for key = fliplr(unique(A(:,2)'))
        ndx = A(:,2) == key;
        B{key} = A(ndx,1)';
    end
    

    【讨论】:

    • 那个 Fliplr 技巧为我节省了 5 秒,谢谢。但我需要更多:D
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2015-01-17
    相关资源
    最近更新 更多