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 ループで実行したくないことに注意してください。並列処理を利用した関数を使いたい。

4

2 に答える 2

6

ここで使用できaccumarrayます:

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

Aそれがソートされていて、2 番目の列から欠落しているエントリがないことがわかっている場合は、次を使用することもできmat2cellます。

counts = histc(A(:,2),unique(A(:,2)));
B = mat2cell(A(:,1),counts);
于 2013-03-01T14:15:37.893 に答える
1

これを行う簡単な方法を次に示します。Bループを使用しますが、セル配列は逆インデックス トリックを使用して事前に割り当てられているため、非常に高速です。

for key = fliplr(unique(A(:,2)'))
    ndx = A(:,2) == key;
    B{key} = A(ndx,1)';
end
于 2013-03-01T13:48:54.100 に答える