我正在运行以下代码,其中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
中有多少索引为'new'(即稀疏矩阵中没有值)
有更有效的方法吗?
答案 0 :(得分: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)
使用向量i
,j
和s
生成m
- by -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