4

この質問は、最初の列の値が同じ場合、行列またはcsvを変換して2番目の列の値を同じ行に配置するためのMatLab(または他の言語)の派生物ですか?

もしも

      A = [2 3 234 ; 2 44 33; 2 12 22; 3 123 99; 3 1232 45; 5 224 57]

1 列目 | 2 列目 | 3列目

2             3          234
2             44         33
2             12         22
3             123        99
3             1232       45
5             224        57

その後、実行中

    [U ix iu] = unique(A(:,1) ); 
    r= accumarray( iu, A(:,2:3), [], @(x) {x'} )

エラーが表示されます

    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.

作りたい

第 1 列 | 2列目 | 3列目 | 4列目 | 5列目 | 6列目| 7列目

2         3        234       44        33        12        22
3         123      99        1232      45
5         224      57

for と if を使用してそれを行う方法は知っていますが、ビッグデータに時間がかかりすぎます。

これどうやってするの?

前もって感謝します!

4

1 に答える 1

2

accumarray前の質問に提供された解決策を誤用しています。最初のパラメーターiuはインデックスのベクトルで、2 番目のパラメーターは同じ長さの値のベクトルでなければなりません。ここで行ったことは、2 番目のパラメーターとして行列を指定することです。実際には、 のインデックスよりも 2 倍多くの値がありますiu

それを機能させるために必要なことは、2 番目の列と 3 番目の列の両方にインデックスのベクトルを作成し (それらは偶然ではなく同じインデックスです!)、値の一致する列ベクトルを次のように指定することです。

[U, ix, iu] = unique(A(:,1));
vals = reshape(A(:, 2:end).', [], 1);                    %'// Columnize values
subs = reshape(iu(:, ones(size(A, 2) - 1, 1)).', [], 1); %'// Replicate indices
r = accumarray(subs, vals, [], @(x){x'});

このソリューションは、 に渡す任意の数の列に対して一般化されていますaccumarray

于 2013-07-03T13:04:17.257 に答える