Matlab的Accumarray使用稀疏矩阵乘法

时间:2016-10-28 06:14:51

标签: matlab sparse-matrix accumarray

我在matlab中有以下说明

out = accumarray (A,B,sz);

其中B和A的大小分别为1x957600和957600x1,sz为[1445 1]。结果是1445x1大小。

我的问题是如何在不使用accumarray和使用稀疏矩阵乘法的情况下实现此指令。

我发现以下解决方案,但我不知道如何根据我的数据

实现它

Matlab代码

%fake data setup
    M=1e5;
    A=kron(speye(M),ones(1,16));
    N=size(A,2);
    [I,J]=find(A);
    x=rand(N,1);
    %pretend we build A from scratch
    tic; 
     A=sparse(I,J,1);
    toc %Elapsed time is 0.062737 seconds.
    %Apply A
    tic
      y1=A*x;
    toc %Elapsed time is 0.006868 seconds.
    %Using accumarray
    b=x(J);
    tic
     y2=accumarray(I,b,[M,1]);
    toc %Elapsed time is 0.012236 seconds.

我问这个问题因为我想在c ++中使用accumarray。我有一个解决方案,但它花了很多时间来进行计算。 Here是我两天前的问题,其中包含了针对accumarray的c ++实现。

1 个答案:

答案 0 :(得分:1)

使用

sparse(A, 1, B, sz(1), sz(2))

示例:

A = [5;4;6;5;2;5;2;5;5;2];
B = [6 3 1 4 9 8 1 5 8 9];
sz = [10 1];
out = accumarray (A,B,sz);
out2 = sparse(A, 1, B, sz(1), sz(2));

这给出了

>> out
out =
     0
    19
     0
     3
    31
     1
     0
     0
     0
     0
>> full(out2)
ans =
     0
    19
     0
     3
    31
     1
     0
     0
     0
     0