我定义了一个函数
matrix.create()
生成一个 m x n
矩阵,我将使用一个循环为每个 t = 100
时间步长生成矩阵。结果应该是一个大矩阵m*t x n
.
有没有简单的方法来做到这一点?我应该在函数内连接矩阵吗?
避免循环的一种方法:
## demo function (returns an n x m matrix of NAs)
create_matrix <- \(n, m) matrix(, n, m)
n = 1
m = 3
t = 4
do.call(rbind, replicate(t, create_matrix(n, m), simplify = FALSE))
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA
[3,] NA NA NA
[4,] NA NA NA
我不确定
matrix.create
返回的矩阵内容是什么样的,但也许这个一般示例会有所帮助:
matrix.create <- function(m,n){
return(matrix(NA,nrow = m,ncol = n))
}
mat <- matrix.create(m = 1,n = 2)
for(t in 2:100){
mat <- rbind(mat,matrix.create(m = 1,n = 2))
}
mat
这里是如何(一种方法)避免增长矩阵(效率低下:参见例如here或第2章here)当每个矩阵不同时:
res <- list()
for(t in 1:n){
res[[i]] <- matrix.create(...)
}
mat <- do.call("rbind", res)
请注意,通过附加对象来增加列表(这基本上是我们在这里所做的,尽管是以 R 式的方式)确实 not 招致与增加向量、矩阵或数据框相同的惩罚。
这样做可能稍微更有效率:
nr <- 10; nc <- 10 ## or whatever
mat <- matrix(NA_real_, nrow = nr*n, ncol = nc)
ind <- 1
for (t in 1:n) {
mat[ind:(ind+nr),] <- matrix.create(...)
ind <- ind + nr
}
除了增加当前索引变量,您还可以通过在每一步计算适当的索引来做到这一点(即,
((t-1)*nr + 1):(t*nr)
)