【发布时间】:2016-07-31 17:10:10
【问题描述】:
我有一个网络的邻接矩阵,并且想要计算 Adamic-Adar 分数。它的定义如下:对于每对边 x 和 y,让 z 作为它们的共同邻居之一,并且 |z|是邻居的度数。
现在分数被定义为所有公共邻居 z 的总和:
我为 MATLAB 编写了一个小算法,但它使用了两个 for 循环。我相信它可以做得更快,但我不知道如何。您能否指出如何加快速度?
% the entries of nn will always be 0 or 1, and the diagonal will always be 0
nn=[0 0 0 0 1 0; ...
0 0 0 1 1 0; ...
0 0 0 0 1 0; ...
0 1 0 0 0 1; ...
1 1 1 0 0 0; ...
0 0 0 1 0 0];
deg=sum(nn>0);
AAScore=zeros(size(nn));
for ii=1:length(nn)-1
for jj=ii+1:length(nn)
NBs=nn(ii,:).*nn(jj,:);
B=NBs.*deg;
C=B(B>1);
AAScore(ii,jj)=sum(1./log(C));
end
end
AAScore
如有任何建议,我将不胜感激,谢谢!
比较运行时
我的 nn 有大约 2% 的条目,所以它可以近似为:
kk=1500;
nn=(rand(kk)>0.98).*(1-eye(kk));
- 我的双倍时间:37.404445 秒。
- Divakar 的第一个解决方案:58.455826 秒。
- Divakar 的更新解决方案:22.333510 秒。
【问题讨论】:
-
@Divakar,是的,它总是只有 0 和 1。 (我编辑问题)
-
nn的典型大小是多少? -
nn 的典型尺寸在 5000x5000 或 6000x6000 之间。
标签: algorithm performance matlab network-programming vectorization