Re: [問題] list 元素加總,如何不用loop做到

看板R_Language作者 (攸藍)時間10年前 (2015/01/17 23:36), 5年前編輯推噓3(301)
留言4則, 4人參與, 最新討論串2/2 (看更多)
我可以demo一個簡單的效率比較 code: https://pastebin.com/5mV0d8ZN Reduce是除了用rcpp外最快的,無話可說 但是Reduce有一個重大缺點 需要較多的RAM才可以運行 因此,當你的matrix大小越大或是list長度越長 (資料越多) 就會無法使用,這時候就要找替代方案 最簡單的方式就是直接用迴圈做,穩又比除了Reduce跟Rcpp之方法快 至於版友提到先轉向量,然後做rbind or cbind後做和,再轉回原維度 因為reshape動作過多,影響效率,個人並不推薦 最快又最省記憶體的方式便是透過RcppArmadillo (RcppEigen也可) (RcppEigen在windows裡預設的BLAS比RcppArmadillo快,因此效率會更好) 在我的例子中,跟Reduce可以差到2.4倍 但是當list長度增加或是matrix大小增加時,Reduce就會慢下來 (這可以自行測試) 至於迴圈就穩定維持在差距2.9倍左右 補充: 一、因為要把list中的矩陣都相加,所以openmp並不會改善多少效率 (利用#pragma omp atomic,不確定有沒有其他方案可以使用), 這裡就沒有去寫相關的程式碼了 二、直接使用do.call去做: do.call(.Primitive("+"), mat.list) 三、化做三維陣列去做也可以,只是用apply(mat.array, 1:2, sum) 必定比直接用Reduce慢。 另外,我認為list是R比較方便輸出的資料格式,把程式設計使用於三維陣列比較不方便 四、Machine: i7-4770K@4.2GHz 16G ram windows 7 64bit R-3.1.2 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.148.4 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1421508987.A.88C.html ※ 編輯: celestialgod (223.138.148.4), 01/17/2015 23:58:42

01/18 01:20, , 1F
所以上一題的正解還是 Reduce('+', mat.list) ?
01/18 01:20, 1F

01/18 09:17, , 2F
結論來說,是的。
01/18 09:17, 2F

01/18 11:34, , 3F
程式 + 說明, 好文章, 推.
01/18 11:34, 3F

01/21 20:29, , 4F
感謝板主!推
01/21 20:29, 4F
※ 編輯: celestialgod (219.70.162.88 臺灣), 12/06/2019 21:46:45 ※ 編輯: celestialgod (219.70.162.88 臺灣), 12/06/2019 21:59:10
文章代碼(AID): #1Kke5xYC (R_Language)
文章代碼(AID): #1Kke5xYC (R_Language)