Re: [问题] grid生样本 避免for循环

楼主: locka (locka)   2019-03-27 23:19:58
感谢 celestialgod 版主大大提点:
以前以为 *apply 家族的函数就已经是向量化(vectorized)的写法了
查了资料才发现其实底层背后还是有 for 循环 (觉得震撼啊...)
试试看这样的写法
theta <- seq(0,1,len=100)
df <- rep(19,len=100)
n <- rep(20,len=100)
vrt <- Vectorize(rt)
x <- vrt(n=n, df=df, ncp=1/theta)
于是 x[,1] ... x[,100] 就是100个 n 等于20 然后对应各自 delta 值的 t 分配样本了
(但是不知道 df, n 的预先定义有没有意义?)
请版上各位高手再指点~ 谢谢大家
======
补充:
但还是有查到 *apply function 的好处:
1. 程式易读性
2. 会 pre-allocate 向量的内存空间
2. 只影响区域变量不会改变全域变量
ref: https://www.r-bloggers.com/vectorization-in-r-why/
※ 引述《ntpuisbest (阿龙)》之铭言:
: n <- 20
: theta=seq(0,1,len=100)
: rt(n ,1/theta )
: 如题
: 我想要生100组 ,每组都是n=20的t分配样本
: 只是这100组的theta都不一样
: 我像上面那样打 只会回传20个样本
: 并不是我想要的 2000个样本 请问要如何打才能要我要的结果
: 想避免for loop
: 用loop的话 我知道怎么做
作者: VIATOR (阿布拉卡达不拉)   2019-04-11 23:57:00
*apply各种变形各有些微不同,之后可能还要用do.call,rbind而且如果想用平行运算,可能还要改回foreach我虽然会用*apply了,但常常怀疑*apply的好处preallocate 大概是我目前唯一觉得的好处但懂得自己preallocate 的话,其实for循环也没什么不好
作者: VIATOR (阿布拉卡达不拉)   2019-04-11 07:59:00
其实我对于易读性这点很怀疑大部分人都能够很快 看懂 for循环可是对于apply语法不懂的人很难看懂apply
楼主: locka (locka)   2019-04-11 08:32:00
看不懂apply那可以从sapply开始学(认真误) 我以前也觉得要指定row或column参数的apply很难看懂;相较之下sapply亲切多了,传进去的就是迭代进FUN的参数,跟for是一样的概念,还更有弹性。看得懂for就看的懂sapply(应该吧XD)
作者: celestialgod (天)   2019-04-12 14:02:00
基本上我同意apply系列没什么好处 这也算是R特殊的撰写风格,大多数人称这种写法是functional programming,来避免一些太复杂的程式计算,至于好处坏处就是各有利弊,每个人看法不同至于平行的话,parallel::parLapply也都可以做,并不是只有foreach能用
作者: VIATOR (阿布拉卡达不拉)   2019-04-12 14:36:00
apply系列,MATLAB有类似的写法,不过不常看到人用parLapply能处理lapply,但windows就没有办法平行mcapply
作者: celestialgod (天)   2019-04-12 19:50:00
MATLAB的cellfun跟arrayfun 我的爱XDD我用matlab几乎都用那个处理资料= =matlab虽然有JIT,但是preallocation还是比较快

Links booklink

Contact Us: admin [ a t ] ucptt.com