2016-06-28 88 views
1

以下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 

回答

2

簡單地說,對於每一行中A,你確定是非零和使用這些指標來總結在相應的位置在V並通過d相應的條目劃分的位置。

首先使用find確定非零行和列的位置,然後組的所有使用accumarray和功能他們共同排列位置的應用上accumarray只會所有指數總結了一旦索引V

像這樣的東西可以工作:

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) 

m=size(A,2); 
[row,col] = find(A); % Find non-zero entries in A 
meanNV = accumarray(row, col, [m 1], @(x) sum(V(x))) ./ d; % Compute desired result 

end 
+0

@rayryeng您好,感謝您的幫助。我在前面的代碼中犯了一個錯誤。 sumNode = 0的初始化;應該在循環內部之外。 A表示節點之間的鏈接。如果節點i和j連接,則A(i,j)= 1。否則,A(i,j)= 0. 我想獲得i的鄰居節點的所有特徵向量的平均值。鄰居節點都是與節點i有連接的節點,其中A(i,j)= 1。它應該累積在A中相應位置上有1的所有V(j)。然後用d(i)除和。 d(i)表示來自節點i的連接度/總數。謝謝。 – ARSN

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 
+0

我想寫一個不使用循環的答案....我可以保證更快。你想看看? – rayryeng

+0

當然。這需要10分鐘才能運行。 – ARSN

+0

完成。檢查我的編輯。 – rayryeng