2014-11-05 111 views
0

我需要一些幫助並列化或加快下面的嵌套循環:加快嵌套循環創建一個鄰接矩陣

  1. 具有頂點(通過ID號識別)的列表,每個ID有一串與其相關的數字(字符串有限長度,通常爲60-200)。

id是一個約。 10,000個不同的ID

seq是(不同長度)的序列的列表,具有唯一ID

相關聯的每個序列
  • 我想在建立所述圖的鄰接矩陣如果頂點i和頂點j連接在一起,如果它們的序列具有相同的元素。這裏是代碼我試圖改善:

    id_matrix<-matrix(nrow=length(id),ncol=length(id)) 
    for (i in 1:(length(id)){ 
        for (j in 1:(length(id)){ 
         edgelist[i,j]=length(intersect(seq[i],seq[j]) 
        } 
    } 
    
  • (這將用於非重疊-ID序列產生0,並且每當存在重疊,其可以用作權重的有限數目邊緣和歸一化)。

    我試過foreachdopar等選項,但是我沒有成功。用length(id)=100運行需要2分鐘以上!全場比賽至少需要一個月!我正在使用R Studio版本0.98.507的Windows PC上工作。

    任何幫助將不勝感激,特別是對在R.並行這兩個嵌套循環

    注意:這是一個稀疏矩陣:所有可能的10^8邊緣發生的約1%。

    謝謝你的幫助!

    +1

    查找到包的igraph。 – Roland 2014-11-05 08:10:43

    +0

    我同意'igraph'(或者''Rcpp')可能是要走的路。感興趣的是,基本的R解決方案可能看起來像這樣:'library(parallel); v < - setNames(replicate(10,sample(100,sample(5:10,1))),1:10); cl < - makeCluster(detectCores() - 1); clusterExport(cl,'v'); (x,y)長度(相交(x,y)))); STOPCLUSTER(CL)'。 – jbaums 2014-11-05 08:32:53

    +0

    是'edgelist'初始化?一個10.000 x 10.000循環應該在合理的時間內可行。 – 2014-11-05 08:46:00

    回答

    0

    在我的電腦

    id_matrix <- matrix(0, nrow = length(id), ncol = length(id)) 
    for (i in 1:length(id)) { 
        for (j in i:length(id)) { 
         id_matrix[cbind(c(i,j),c(j, i))] <- length(intersect(seq[[i]],seq[[j]])) 
        } 
    } 
    

    只需不到半小時,當length(id)爲10000