R_Language 板


LINE

※ 引述《a78998042a (Benjimine)》之铭言: : [问题类型]: : 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来) : [软体熟悉度]: : 使用者(已经有用R 做过不少作品) : [问题叙述]: : 我需要将程式向量化 : 使用回圈、apply系列的函数太慢了 : 但不用apply又做不出来 : 想询问大家的经验 : [程式范例]: : ###vactor的问题 : #我想将一个向量分别加上一个数字 : x = 1:3 : y = rep(0, 3) : #我想得到类似下面结果,但不用apply, 不用回圈的做法 : sapply(x, function(x) y + x, simplify = FALSE) : [[1]] : [1] 1 1 1 : [[2]] : [1] 2 2 2 : [[3]] : [1] 3 3 3 我犹豫了一下要怎麽回你XD 不过我觉得sapply, lapply够快了,而且for也很好用 我写了一个简单的测试,我不认为这会是你程式速度的瓶颈: PS: 相信你的y不是全部0,不然用mapply + rep最快 y <- 1:3e4 x <- 1:1e4 st <- proc.time() z1 <- sweep(array(y, c(length(y), length(x))), 2, x, '+') proc.time() - st # user system elapsed # 8.72 0.45 9.19 st <- proc.time() z2 <- sapply(x, function(xi) y + xi) proc.time() - st # user system elapsed # 3.32 0.48 3.83 all.equal(z1, z2) # TRUE st <- proc.time() z12 <- sweep(matrix(rep(y, length(x)), length(y)), 2, x, '+') proc.time() - st # user system elapsed # 8.93 1.10 10.05 all.equal(z1, z12) st <- proc.time() z22 <- sapply(x, function(xi) y + xi, simplify = FALSE) proc.time() - st # user system elapsed # 0.58 0.45 1.05 st <- proc.time() z3 <- lapply(x, function(xi) y + xi) proc.time() - st # user system elapsed # 0.53 0.17 0.70 all.equal(z22, z3) # TRUE st <- proc.time() z4 <- vector('list', length(x)) for (i in seq_along(x)) z4[[i]] <- y + x[i] proc.time() - st # user system elapsed # 0.61 0.04 0.65 all.equal(z4, z3) # TRUE : ###array的问题 : #我想将array不同维度的物件,扣除不同数字 : temp.ar = array(matrix(0, 2, 3), c(2, 3, 2)) : #我想得到类似下面的结果 : sapply(1:2, function(x)temp.ar[,,x] + x,simplify = FALSE) : [[1]] : [,1] [,2] [,3] : [1,] 1 1 1 : [2,] 1 1 1 : [[2]] : [,1] [,2] [,3] : [1,] 2 2 2 : [2,] 2 2 2 : #另一个问题是,sapply会将物件转成list,增加後续处理上的难度 : #例如我无法直接对list取round : #使用sapply的simplify又会将破坏结构,之後可能需要再重新架构 : #但如果结构是array就可以直接做一些函数运算 : #不知道大家有这方面的经验可以分享吗 : #谢谢! arr <- array(0, c(2, 3, 1e4)) st <- proc.time() z <- sweep(arr, 3, 1:1e4, '+') proc.time() - st # user system elapsed # 0.00 0.02 0.02 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.109.74.87
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1458548400.A.66C.html ※ 编辑: celestialgod (140.109.74.87), 03/21/2016 16:44:54
1F:推 a78998042a: 谢c大,我现在遇到的问题是,我需要将函数向量化 03/21 18:41
2F:→ a78998042a: 那使用R内建的向量化函数,很难直接增加程式的效率 03/21 18:42
3F:→ a78998042a: 那单一维度参数的向量化很容易,但多维度参数涉及许多 03/21 18:43
4F:→ a78998042a: 阵列的使用技巧,我觉得我的问题是在对基本物件的不熟 03/21 18:44
5F:→ a78998042a: 悉,遂想上来请教大家的经验 03/21 18:45
6F:→ a78998042a: 可能是长久依赖apply的关系,对於要怎麽快速运用基础 03/21 18:47
7F:→ a78998042a: 语法快速做到类似apply的事情,就没有太多经验 03/21 18:48
8F:→ a78998042a: 一些情况下,让R的apply帮助向量化是很没有效益的 03/21 18:50
9F:→ a78998042a: 我觉得apply是将所有情况考虑後,所做出的function 03/21 18:51
10F:→ a78998042a: 他无法针对单一问题做到最佳化,所以就想上来请教各种 03/21 18:53
11F:→ a78998042a: 基础物件的语法撰写计巧,可以帮助程式撰写的效率这样 03/21 18:55
我不知道你为什麽觉得有一定的基础物件语法能够帮助你提速 就以你提的第一例子来说,回圈跟sapply/lapply就很够用了 包成一个函数或是因此去写一个c++ function并没有太大的意义 如果你主要的对象都是矩阵或是阵列的话 那麽你依靠sapply系列函数并没有什麽缺点 慢都会在BLAS的部分,而非R语法的问题 至於对行列运算的apply,都可以用sweep取代 其他加速方式还有使用多执行绪、用C++ 在R上面,就我的认知而言,for跟sapply已经是很好用的工具了 剩下的是你对矩阵的熟悉度,去做manipulation,而非语法或是函数问题 这部分,你要有明确的例子,才有办法给你一些建议 ※ 编辑: celestialgod (140.109.73.232), 03/21/2016 20:18:43
12F:推 JackBaska: 我其实看到觉得lapply跟sapply会慢也觉得很怪,通常是 03/21 20:51
13F:→ JackBaska: Algorithm没弄好或没有充分运用到该用的型态 03/21 20:52
14F:→ JackBaska: 不过for很慢是肯定的....可惜recursive有上限5,000 03/21 20:52
15F:推 JackBaska: 如果现有的,stackoverflow找不到满意的解,欢迎Rcpp一下 03/21 21:15







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP