以下MATLAB代码永远在10 ^ 5方阵A上运行。但是,它在10 ^ 3方阵上运行几秒钟。有没有办法加快速度?
function [meanNV]=calcMeanNV_k(A,V,d)
%A: input matrix (n x n)
%V: eigenvectors of k-th largest eigenvalues (n x 1)
%d: degrees of each node (n x 1)
%meanNV: mean of neighbors vectors (n x 1)
m=size(A,2);
meanNV=zeros(113336);
for i=1:m
sumNode = 0;
for j=1:m
if A(i,j)==1
sumNode=sumNode+V(j);
end
end
[meanNV(i)]=sumNode/d(i);
end
答案 0 :(得分:2)
简单地说,对于A
中的每一行,您要确定非零的位置,并使用这些索引对V
中的相应位置求和并除以{中的相应条目{1}}。
首先使用find
确定非零行和列位置,然后使用accumarray
按公共行对所有列位置进行分组,并在d
上应用的函数将索引到accumarray
后,只需将所有索引求和。
这样的事情可行:
V
答案 1 :(得分:1)
这有效:
function [meanNV]=calcMeanNV_k1(A,V,d)
%A: input matrix (n x n)
%V: eigenvectors of k-th largest eigenvalues (n x 1)
%d: degrees of each node (n x 1)
%meanNV: mean of neighbors vectors (n x 1)
tic
m=size(A,2);
meanNV=zeros(m,1);
idx = A == 1;
for k = 1:m
meanNV = sum(V(idx(k,:)));
end
meanNV = meanNV./d;
toc