2017-03-09 41 views
1

我有以下R代碼。函數Heaviside2是Heaviside階躍函數,而矩陣A是數據矩陣。我該如何加速R中的雙循環?

for (i in 1:N){ 
    for (j in 1:N){ 
     if (j!=i) { 
      arg=r-normvec(A[i,]-A[j,]) 
      s=s+Heaviside2(arg) 
     } 
    } 
} 

我試圖加快這段代碼,刪除double,但內部的「if」使它更加困難。

在此先感謝

+0

您可以使用'dput'函數提供您的數據樣本嗎? – ira

+0

你可以重構雙循環爲'for(i in 1:N-1)'和'for(j in i:N)',但是你仍然需要將'normvec()'兩次消失。也許如果你只需要計算一次,那麼這個選項會使你的速度提高2倍。 –

+0

你確定for循環在速度上扮演什麼角色嗎?我認爲它會被N^2'normvec'調用所控制。 –

回答

2

在你的情況dist功能是非常有幫助的。所以我認爲,解決辦法是

sum(Heaviside(r - dist(A))) 

我不知道是什麼Heaviside函數你使用的,但我使用從fBasics包一個。