使用 R 循环创建和追加矩阵

问题描述 投票:0回答:3

我定义了一个函数

matrix.create()
生成一个
m x n
矩阵,我将使用一个循环为每个
t = 100
时间步长生成矩阵。结果应该是一个大矩阵
m*t x n
.

有没有简单的方法来做到这一点?我应该在函数内连接矩阵吗?

r join matrix concatenation append
3个回答
0
投票

避免循环的一种方法:

## 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

0
投票

我不确定

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

0
投票

这里是如何(一种方法)避免增长矩阵(效率低下:参见例如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)

© www.soinside.com 2019 - 2024. All rights reserved.