1

私は情報のベクトルを持っています。

Info = [10, 20, 10, 30, 500, 400, 67, 350, 20, 105, 15];

もう1つはIDのベクトルです。たとえば、次のようにします。

Info_IDs = [1, 2, 1, 4, 2, 3, 4, 1, 3, 1, 2];

次のように定義された行列を取得したいと思います。

Result =
    10    10   350   105
    20   500    15     0
   400    20     0     0
    30    67     0     0

各行にはInfo、異なる ID に対応する の値が表示されます。この短い例に見られるように、1 行あたりの値の数はID行ごとに異なります。

私は大量のデータ ( Info1x1000000 と1x25000) を扱っているので、できればループなしでこのマトリックスInfo_IDsを達成したいと考えています。Result私が考えていた 1 つの方法は、ID ごとにヒストグラムを計算し、この情報を保存することです (したがってResult、元の情報は含まれませんが、ビン化された情報が含まれます)。

ご意見をお寄せいただきありがとうございます。

4

3 に答える 3

0

ループを使用しないことについてはわかりませんが、これはかなり高速です:

Result = [];
n = 4; %i.e.  number of classes
for c = 1:n 
    row = Info(Info_IDs == c);
    Result (c, 1:size(row,2)) = row;
end

そして、速度が本当に問題である場合は、次のように事前に割り当てることができますResult = zeros(4, sum(Info_IDs == mode(Info_IDs)))

于 2013-08-05T15:56:12.617 に答える
0

間にゼロを入れても構わない場合:

number_Ids = 4; % set as required
aux = (bsxfun(@eq,Info_IDs,(1:number_Ids).'));
sol = bsxfun(@(x,y) x.*y,Info,aux)

これにより、あなたの例では次のようになります。

10     0    10     0     0     0     0   350     0   105     0
 0    20     0     0   500     0     0     0     0     0    15
 0     0     0     0     0   400     0     0    20     0     0
 0     0     0    30     0     0    67     0     0     0     0

または、ゼロは気にするが順序は気にしない場合は、sort行ごとにこの結果を得ることができます。

sol2 = sort(sol,2,'descend')

を与える

350   105    10    10     0     0     0     0     0     0     0
500    20    15     0     0     0     0     0     0     0     0
400    20     0     0     0     0     0     0     0     0     0
 67    30     0     0     0     0     0     0     0     0     0

編集:ゼロ以外のエントリの順序は、ここと同じトリックを使用して保持できます

于 2013-08-05T16:25:29.993 に答える