Re: [问题] list 元素加总,如何不用loop做到

楼主: celestialgod (天)   2015-01-17 23:36:25
我可以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
作者: memphis (让你喜欢这世界~)   2015-01-18 01:20:00
所以上一题的正解还是 Reduce('+', mat.list) ?
楼主: celestialgod (天)   2015-01-18 09:17:00
结论来说,是的。
作者: HeroNoah   2015-01-18 11:34:00
程式 + 说明, 好文章, 推.
作者: a78998042a (Benjimine)   2015-01-21 20:29:00
感谢板主!推

Links booklink

Contact Us: admin [ a t ] ucptt.com