【问题标题】:Matlab's Accumarray using Sparse matrix multiplicationMatlab Accumarray 使用稀疏矩阵乘法
【发布时间】:2016-10-28 06:14:50
【问题描述】:

我在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++ 实现。

【问题讨论】:

    标签: matlab sparse-matrix accumarray


    【解决方案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
    

    【讨论】:

    • 谢谢!工作得很好。现在我只是找到了一种在 C++ 中执行此操作的方法。 Armadillo 不支持使用相同索引的稀疏初始化。所以可能我将不得不寻找其他一些图书馆。
    • 我错了。犰狳确实支持使用相同位置sp_mat(add_values, locations, values, n_rows, n_cols, sort_locations = true, check_for_zeros = true) 进行稀疏矩阵初始化。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2014-10-09
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多