4

我正在运行以下代码,其中M是 ~200,000 × ~200,000 稀疏矩阵和points~200,000 × 2 矩阵

inds=sub2ind(size(M),points(:,1),points(:,2));
M(inds)=M(inds)+1;

问题是第二行需要很长时间才能运行(15-90 秒)。该操作需要更长的时间,具体取决于有多少索引inds是“新的”(即在稀疏矩阵中还没有值)

有没有更有效的方法来做到这一点?

4

1 回答 1

4

这是一个想法:

M = M + sparse(points(:,1),points(:,2),1,size(M,1),size(M,2),size(points,1));

只是让你知道,

S = sparse(i,j,s,m,n,nzmax)使用向量ijs来生成一个 m稀疏n矩阵,使得S(i(k),j(k)) = s(k),空间分配给nzmax非零值。向量ijs都是相同的长度。其中任何为零的元素以及和s的相应值都将被忽略。任何具有重复值的元素和被加在一起。ijsij

对于好奇:

M = sprand(200000,200000,1e-6);
points = [randperm(200000) ; randperm(200000)]'; %'//Initialization over
Mo = M;
tic; 
inds=sub2ind(size(Mo),points(:,1),points(:,2));
Mo(inds) = Mo(inds)+1;
toc
tic; 
M = M + sparse(points(:,1),points(:,2),1,size(M,1),size(M,2),size(points,1));
toc
于 2012-10-07T00:45:12.300 回答