作者celestialgod (天)
看板R_Language
标题Re: [问题] 保持物件结构,将值依照预设填入问题。
时间Thu Sep 14 00:02:35 2017
※ 引述《wheado (principal component QQ)》之铭言:
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: 效能谘询(我想让R 跑更快)
: [软体熟悉度]:
: 入门(对语法不熟悉)
: [问题叙述]:
: 保留物件结构,假设我有一个物件如下:
: obj_A <- list(matrix(NA,nrow = 2,2),
: matrix(NA,nrow = 3,2),
: matrix(NA,nrow = 2,1));
: 假设我有一些数值,如下:
: num <- 1:12;
: 有甚麽办法可以很快的
: 将 num 中的数字按照 R 内建排列矩阵的方式将值填入,
: 但又不破坏物件的结构。
: 我试过写for回圈来解决,但是当矩阵及数值是大量的时候会等很久,
: 例如每个矩阵都是5000*2000这种的QQ
: 想问有没有类似"将值填入物件"的指令,让coding可以更简单快速。
: [程式范例]:
: https://ideone.com/HPIsOg
: [环境叙述]:
: windows10
: [关键字]:
: 惭愧不知道怎麽找相关资讯。
好读板:
https://pastebin.com/UpgqyUTK
# 产生一百万个常态变数值
num <- rnorm(1e6)
# 建一个要输出的matrix dimention的list
struct <- list(c(500, 900), c(500, 100), c(250, 350), c(550, 750))
st <- proc.time()
# 先把数字切成你要的length (#rows * #columns)
out <- split(num, rep(seq_along(struct), sapply(struct, Reduce, f = `*`)))
# 把每个list改成你要的dimension
for (i in seq_along(struct))
dim(out[[i]]) <- struct[[i]]
proc.time() - st
# user system elapsed
# 0.17 0.01 0.18
# 确认结果跟原PO想要的一样
all(unlist(out) == num) # TRUE
一百万个数值切成四个矩阵差不多0.2秒
一千万个拆成十个,我猜大概也不过十秒以内的事情
这样希望能够解到原PO的问题
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.170.62.243
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1505318559.A.6AD.html
1F:推 wheado: 跪着读,谢谢大大分享。 09/14 00:05
只是好像matrix dimension可以用matrix存
第一个column存row size,第二个存column size
切长度那里就用第一个column乘上第二个column就好
然後for就是一次取一个row
但这就给原PO自己改吧(摊手,我是觉得不影响拉
※ 编辑: celestialgod (118.170.62.243), 09/14/2017 00:09:08
2F:推 wheado: 似乎关键在split呀... 09/14 00:13
3F:→ celestialgod: 对,用split切完几乎就结束了 09/14 00:14