作者a78998042a (Benjimine)
看板R_Language
标题[问题] list 元素加总,如何不用loop做到
时间Thu Jan 15 16:17:18 2015
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]
想使用apply类型的函数将list内的元素加总,而不使用for loop
[程式范例]:
mat=matrix(1:4,2,2)
mat.list=list(mat,mat,mat)
想加总成单一的矩阵
结构为:matrix(c(3,6,9,12),2,2)
有人知道不用loop的情况可以怎麽做吗?
谢谢
--
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.152.120
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1421309862.A.0CF.html
1F:推 koai: 试试看 ?sapply 01/15 16:18
感觉好像有难度,lapply系列的,都是针对list的每一个物件,物件跟物件间的
元素好像没办法@@
2F:推 obarisk: do.call 01/15 17:38
我试试!谢谢
3F:推 celestialgod: apply(mat. list, 1:2, sum) 01/15 18:14
这个好像无法度
4F:推 celestialgod: Reduce也可以,只是do.call最有效率 01/15 18:15
我试试看,谢谢
5F:推 raysonic: Reduce('+' , mat.list) 01/15 18:44
感谢!!!解决了!!!!
抱歉,有人能示范在do.call要怎麽做到这件事吗?我目前没试出来
6F:→ obarisk: do.call好像不能用`+`,还是先用Reduce吧Orz 01/15 21:49
7F:→ obarisk: 要指定`+`.__C__matrix,但是这个我试不出来 01/15 21:54
感谢你,以前没用过do.call,现在看到就能开始想用在哪了~
8F:推 memphis: 如果list中的matrix大小一样 建议你这样做 01/15 22:07
9F:→ memphis: matrix(rowSums(matrix(unlist(mat.list), nrow=4)), nro 01/15 22:08
10F:→ memphis: w=2) 01/15 22:08
谢谢!!学习了!!!
11F:→ a78998042a: 谢谢!!!学习了 01/16 02:46
回报一下,我以Reduce的方法与m大以拆开再拼的做法比较,以长度为12582912的2by2
矩阵相加,Reduce是12.38秒,unlist是1.84秒。谢谢!!
12F:→ clickhere: do.call(.Primitive("+"), mat.list) 01/16 05:48
感谢!这样写在length(mat.list)==2时确实可以,长度>2的还要再试试
13F:→ obarisk: apply和 for的效能应该没差多少 01/16 09:26
你好,参考一下,因为最近学校给了份模拟跌代的作业,写出来的结果,for要约3.7天,
通篇apply2.5天,再配合sapply进行优化有人到1.5天以内(Reduec),接着可能会试M大
的方法。
※ 编辑: a78998042a (140.116.152.120), 01/16/2015 14:26:33
※ 编辑: a78998042a (140.116.152.120), 01/16/2015 14:28:09
14F:→ obarisk: for 要用 compiler,不过我太晓得目前jit的情况 01/16 15:14
15F:→ obarisk: 如果要超过小时的code,还是推RCpp吧 01/16 15:14
谢谢!!又学习了,看来我对R的了解仍是一知半解阿
※ 编辑: a78998042a (140.116.1.136), 01/16/2015 17:35:47
16F:→ yanchenglin: 推Rcpp, RcppArmadillo.还有若是你每次回圈或是模拟 01/16 18:47
17F:→ yanchenglin: 都是独立的,平行运算也很快.Rcpp+平行运算直接逆天!! 01/16 18:48
18F:→ yanchenglin: 简单说,模拟K次,K次间都独立,可以分散到N个CPU平行~~ 01/16 18:49
19F:推 Edster: 为什麽不用array? 01/17 15:31
20F:→ Edster: mat.array = array(mat, 1:3) # 可能是吧, 随意写. 01/17 15:31
21F:→ Edster: sum(mat.array[,,1:3]) 01/17 15:32
22F:→ Edster: 你的每个list维度都一样, 用array比较简单吧. 01/17 15:33
23F:推 celestialgod: 我回错了...apply那个只能用到3维阵列... 01/17 19:44