4

行と列の添え字を行列A(そのサイズも指定)に保持する2つのベクトルrとcが与えられた場合、Aを計算します。ポイントは複数回発生する可能性があり、発生するたびにAの対応する要素をインクリメントする必要があります。例:

r = [1 2 4 3 2];
c = [2 2 1 1 2];
A = zeros(4, 3);

ind = sub2ind(size(A), r, c);
for i = 1 : length(ind)
    A(ind(i)) = A(ind(i)) + 1; % could as well use r and c instead of ind ...
end

これにより、マトリックスが生成されます

A =
     0     1     0
     0     2     0
     1     0     0
     1     0     0

できればループを避けたいです。この問題に対するベクトル化された解決策はありますか?できれば、巨大な一時行列を生成しないもの..。

4

1 に答える 1

5

これはのための仕事ですaccumarray

r = [1 2 4 3 2];
c = [2 2 1 1 2];

%# for every r,c pair, sum up the occurences
%# the [4 3] is the array size you want
%# the zero is the value you want where there is no data
accumarray([r',c'],ones(length(r),1),[4 3],@sum,0)

ans =

     0     1     0
     0     2     0
     1     0     0
     1     0     0

結果の配列に非常に多くのゼロがある場合(つまり、非常にスパースでsparseある場合)、@woodchipsによって提案されているようにより良いオプションである可能性があることに注意してください

sparse(r,c,ones(size(r)),4,3)

ans =

   (3,1)        1
   (4,1)        1
   (1,2)        1
   (2,2)        2
于 2012-04-18T19:08:48.507 に答える