按一个列将矩阵行分组

3

首先,我很难描述这个问题得非常好,但我会尽力。

假设我们有矩阵 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循环来处理。我希望使用可以使用并行处理的函数。
2个回答

6
你可以在这里使用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怎么办? - Austin
1
@Jake:你绝对可以使用 accumarrayB = accumarray(A(:,2),(1:size(A,1))',[],@(x){A(x,:)},{});。窍门是向累加器传递索引向量。 - Jonas
这会导致一个矩阵而不是一个单元数组吗? - Austin
@Jake:不,匿名函数中的花括号可以防止这种情况发生。 - Jonas

1
这里有一个简单的方法。它使用了循环,但应该非常快,因为单元数组B使用了反向索引技巧进行了预分配。
for key = fliplr(unique(A(:,2)'))
    ndx = A(:,2) == key;
    B{key} = A(ndx,1)';
end

那个fliplr的技巧让我省了5秒,谢谢。但我需要更多:D - bop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接