我可以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