精華區beta R_Language 關於我們 聯絡資訊
我可以demo一個簡單的效率比較 code: http://pastebin.com/KCNEcvMi 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去做,我還沒有找到方法,抱歉。 三、化做三維陣列去做也可以,只是用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
memphis: 所以上一題的正解還是 Reduce('+', mat.list) ? 01/18 01:20
celestialgod: 結論來說,是的。 01/18 09:17
HeroNoah: 程式 + 說明, 好文章, 推. 01/18 11:34