Re: [問題] 保持物件結構,將值依照預設填入問題。

作者: celestialgod (天)   2017-09-14 00:02:35
※ 引述《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的問題
作者: wheado (principal component QQ)   2017-09-14 00:05:00
跪著讀,謝謝大大分享。似乎關鍵在split呀...
作者: celestialgod (天)   2017-09-14 00:14:00
對,用split切完幾乎就結束了

Links booklink

Contact Us: admin [ a t ] ucptt.com