R_Language 板


LINE

※ 引述《chu1216 (chu)》之銘言: : 請問一下 : 我想要找非零的index的矩陣, : 因此我用which(XXX != 0, arr.ind = T), : 但因為矩陣的size非常大, 跑起來花很長時間, : 請問有類似且效率比較好的的function嗎? : 感謝!! 我試了一下RcppArmadillo 做了一個小試驗 從結果來看,可能C++可以幫上一點忙,但是要看你sparse的比例 程式碼: library(Rcpp) sourceCpp(code = " // [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadillo.h> // [[Rcpp::export]] arma::uvec find_nonzero_index(const arma::mat & x) { return find(x != 0) + 1; }") genSparseMat <- function(matSize, sparseProp) { x <- matrix(runif(prod(matSize)), matSize[1]) x[x >= sparseProp] <- 0 return(x) } set.seed(100) matSp30 <- genSparseMat(c(5000, 5000), 0.3) matSp20 <- genSparseMat(c(5000, 5000), 0.2) matSp10 <- genSparseMat(c(5000, 5000), 0.1) matSp05 <- genSparseMat(c(5000, 5000), 0.05) matSp01 <- genSparseMat(c(5000, 5000), 0.01) library(microbenchmark) microbenchmark( RWhichSp30 = which(matSp30 != 0), RcppSp30 = find_nonzero_index(matSp30), RWhichSp20 = which(matSp20 != 0), RcppSp20 = find_nonzero_index(matSp20), RWhichSp10 = which(matSp10 != 0), RcppSp10 = find_nonzero_index(matSp10), RWhichSp05 = which(matSp05 != 0), RcppSp05 = find_nonzero_index(matSp05), RWhichSp01 = which(matSp01 != 0), RcppSp01 = find_nonzero_index(matSp01), times = 20L ) 結果: Unit: milliseconds expr min lq mean median uq max neval RWhichSp30 167.1455 182.53765 195.99211 189.95580 207.34010 254.4168 20 RcppSp30 120.1717 125.33950 134.36280 128.67385 134.05210 216.7681 20 RWhichSp20 141.7320 148.71530 164.81187 159.17785 173.29780 224.4695 20 RcppSp20 92.8394 94.95830 99.97492 96.96545 102.32200 122.8803 20 RWhichSp10 118.1888 127.71755 138.10948 136.37605 150.66480 162.9312 20 RcppSp10 53.6464 55.00425 59.48229 59.18855 63.43540 68.5329 20 RWhichSp05 106.1757 111.50920 127.11906 117.38275 133.84795 231.4787 20 RcppSp05 35.1256 36.11950 38.13195 38.11350 39.82205 41.8294 20 RWhichSp01 95.0594 102.33750 113.32983 107.19800 124.01145 150.2782 20 RcppSp01 19.9087 20.64855 21.85202 21.43630 22.75725 26.0881 20 可能的方向: 1. 計算中,產生matrix的時候,是否就可以直接是SparseMatrix,而不用轉換 ex: 用Matrix::sparse.model.matrix 而非使用model.matrix 2. 整個計算移到RcppArmadillo的架構,透過C++加速迴圈 (R迴圈很慢) 3. 重新設計演算法,避免取大量非零元素的index 4. 寫一個OpenMP的C++函數幫你用多個cores跑 因為你沒有提供其他細節,所以我只能提供這樣的方向建議 如果你有一個最小可重現的程式的話,歡迎PO上來 我或是部分有閒的板友應該可以幫忙看看 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.32.179.120 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1663154628.A.7B0.html ※ 編輯: celestialgod (114.32.179.120 臺灣), 09/14/2022 19:42:20
1F:推 lycantrope: arma::find預設回傳nonzero index,稀疏程度好像只差 09/15 13:01
2F:→ lycantrope: 在輸出矩陣大小。nonzero越多所需時間越多 09/15 13:02







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP