[問題] 兩兩比較運算

看板R_Language作者 (<>)時間6年前 (2017/08/30 14:09), 6年前編輯推噓0(006)
留言6則, 2人參與, 最新討論串1/3 (看更多)
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) 不曉得標題這樣下對不對,我想要計算多比不等長的資料(存在list) 舉例:共四筆資料,我想要運算1 vs 2,3,4 ; 2 vs 3,4 ; 3 vs 4 (vs:比較或是運算,並且重覆的不算) 效能諮詢(我想讓R 跑更快) 我已經有使用多層for loop將上述描述實作完畢,但是迴圈多層,運算效能非常差... [軟體熟悉度]: 使用者(已經有用R 做過不少作品) 算是有學了一陣子,但感覺程式邏輯還是很差 [問題敘述]: 如上述,我要運算多筆資料,且作兩兩比較,目的是將計算的結果使用矩陣表示 舉例:共四筆資料,1,2,3,4 想要兩兩比較,並以矩陣方式表示 (如下圖) 1 2 3 2 1vs2 3 1vs3 2vs3 4 1vs4 2vs4 3vs4 [程式範例]: 我直接貼程式碼,並以註解的方式解釋 實際上我要做的是修改DTW這個套件,並已經將裡面的內容改成我要的運算方式 sample_list<- list(1,2,3,4) # 有幾筆資料就設定list放幾筆的資料 tmp1 <-list() i <-1 for(i in 1:3){ tmp <- lapply(sample_list, function(x) x+i) tmp1[[i]] <- unlist(tmp) tmp1[[i]][which(tmp1[[i]]>4)] <- NA } # for 1 到 3(4筆資料-1自己),逐步隨著i值相加,最後將大於4的設為NA tmp1 <-lapply(tmp1, function(x) x[!is.na(x)]) # 把NA 刪掉 tmp_vector<-vector() for (i in 1:3){ for(k in 1:length(unlist(tmp1[i]))){ for(j in unlist(tmp1[i])[k]){ kai<-kai_dtw(x=unlist(data.list[i]) ,y=unlist(data.list[j]), g=0, step.pattern = symmetric1) tmp<- kai$distance tmp_vector <- c(tmp_vector,tmp) } } } # 多層迴圈,達到我要兩兩比較的意境,當中的kai_dtw是我修改演算法的函式 它對應的x與y一定要unlist,後面就是將其取distance存在vector中 tmp_vector1 <- matrix(nrow = 4,ncol = 4) tmp_vector1 <- as.dist(tmp_vector1) tmp_vector1[1:6] <- tmp_vector # 創一個空的矩陣(tmp_vector1)m,並轉算距離矩陣的形式,將前述得到的vector 填入,得到我要的結果 [關鍵字]: dtw , 距離矩陣 ,兩兩比較 以上 就是我的問題敘述,不曉得有沒有表達清楚 基本上就是多層迴圈太慢了,我也正在嘗試使用lapply家族進行運算 謝謝~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.86.113 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1504073346.A.4C9.html ※ 編輯: pk790127 (140.116.86.113), 08/30/2017 14:20:04 ※ 編輯: pk790127 (140.116.86.113), 08/30/2017 14:21:59

08/30 14:27, , 1F
我覺得瓶頸應該是你的演算法不夠快,倒不是填值的loop
08/30 14:27, 1F

08/30 20:10, , 2F
preallocation
08/30 20:10, 2F

08/30 20:10, , 3F
還有 你有必要先搞動[跟[[....
08/30 20:10, 3F

08/30 20:10, , 4F
08/30 20:10, 4F

08/30 20:11, , 5F
kai_dtw這個函數怎麼實做講出來比較快
08/30 20:11, 5F

08/30 20:11, , 6F
這個函數可能是最大的瓶頸
08/30 20:11, 6F
文章代碼(AID): #1PfbQ2J9 (R_Language)
文章代碼(AID): #1PfbQ2J9 (R_Language)