Matlab Accumarray 使用稀疏矩阵乘法
Matlab's Accumarray using Sparse matrix multiplication
我在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++ 实现。
使用
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
我在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++ 实现。
使用
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