我正在运行以下代码,其中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
是“新的”(即在稀疏矩阵中还没有值)
有没有更有效的方法来做到这一点?
我正在运行以下代码,其中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
是“新的”(即在稀疏矩阵中还没有值)
有没有更有效的方法来做到这一点?
这是一个想法:
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)
使用向量i
、j
和s
来生成一个m
稀疏n
矩阵,使得S(i(k),j(k)) = s(k)
,空间分配给nzmax
非零值。向量i
、j
和s
都是相同的长度。其中任何为零的元素以及和s
的相应值都将被忽略。任何具有重复值的元素和被加在一起。i
j
s
i
j
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