1

この質問は、最初の列の値が同じ場合、行列またはcsvを変換して2番目の列の値を同じ行に配置するためのMatLab(または他の言語)の派生物ですか? 最初の列のインデックスで異なる行の値をグループ化する

もしも

      A = [2 3 234 ; 2 44 99999; 2 99999 99999; 3 123 99; 3 1232 45; 5 99999 57]

1st column |  2nd column | 3rd column
--------------------------------------
2             3          234
2             44         99999
2             99999      99999
3             123        99
3             1232       45
5             99999        57

作りたい

1st col |  2nd col | 3rd col | 4th col | 5th col | 6th col| 7th col
--------------------------------------------------------------------
2         3        234       44       
3         123      99        1232      45
5         57

つまり、Aの1列目の各数字に対して、「99999」以外の数字を入れたい

「99999 を除く」部分を無視すると、最初の列のインデックスによって異なる行のグループ値としてコーディングできます。

[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'});

しかし明らかに、このコードは 99999 を無視しません。

2つの方法があると思います

1. first make r, and then remove 99999
2. remove 99999 first, and then make r

いずれにせよ、私はより速いものが欲しいだけです。

前もって感謝します!

4

1 に答える 1

1

オプション 1 の方が良いと思います。つまり、最初に r を作成し、次に 99999 を削除します。r があれば、次のように 99999 を削除できます。

r2 = {}; % new cell array without 99999

for i = 1:numel(r)    
    rCell = r{i};
    whereIs9999 = rCell == 99999; 
    rCell(whereIs9999) = []; % remove 99999
    r2{i} = rCell;
end

またはもっと派手な方法:

r2= cellfun(@(c) {c(c~=99999)}, r);
于 2013-07-16T04:24:27.667 に答える