循环中保存 n 个矩阵 R

3

我刚接触R编程,想要用循环创建n矩阵。

我已经写好了一个循环来创建3个矩阵,但是不知道如何保存这些矩阵。

n=numeric(0)

for (i in 1:3){
  n[i]=5^i
  m=numeric(0)
  m=matrix(data=0,nrow=n[i],ncol=n[i])

  for (j in n[i]:1){
    for (k in 1:i){
     m[j,k]=j+k
    }
  }
}

有人能帮忙吗?

谢谢

3个回答

5
尝试将矩阵存储到列表中。
n=numeric(0)
list_mat <- list()
for (i in 1:3){
  n[i]=5^i
  m=numeric(0)
  m=matrix(data=0,nrow=n[i],ncol=n[i])

  for (j in n[i]:1){
    for (k in 1:i){
      m[j,k]=j+k
    }
  }
  list_mat[[i]] <- m #Holding Matrix
}

输出-

> list_mat[[1]]
   [,1] [,2] [,3] [,4] [,5]
[1,]    2    0    0    0    0
[2,]    3    0    0    0    0
[3,]    4    0    0    0    0
[4,]    5    0    0    0    0
[5,]    6    0    0    0    0

2

你应该将矩阵存储在列表中。现在,每次循环迭代时,你只是覆盖了m

   n = numeric(0)
    out = list()
    for (i in 1:3){
      n[i]=5^i
      m=numeric(0)
      m=matrix(data=0,nrow=n[i],ncol=n[i])

      for (j in n[i]:1){
        for (k in 1:i){
          m[j,k]=j+k
        }
      }
      out[[i]] <- m
    }

更好的做法是使用lapply构建列表,而不是嵌套使用for循环。就像这样:
out_apply <- lapply(1:3, function(i) {
  m <- t(t(matrix(rep(1:5^i, i), ncol = i)) + 1:i)
  cbind(m, matrix(data = 0, nrow = 5^i, ncol = 5^i - i))
  })

all.equal(out, out_apply)

[1] TRUE

0
考虑使用lapply构建返回项列表:
matrix_list <- lapply(1:3, function(i) {

  n <- 5^i
  m <- matrix(data=0, nrow=n, ncol=n)

  for (j in n:1){
    for (k in 1:i){
      m[j,k]=j+k
    }
  }

  return(m)
})

或者,使用sapply构建矩阵列表,传递多个向量,这通常是嵌套的for循环的对应方法。要添加零矩阵,请使用cbind
matrix_list2 <- lapply(1:3, function(i) {

  n <- 5^i
  m <- matrix(data=0, nrow=n, ncol=n-i)
  s <- as.matrix(sapply(1:n, `+`, 1:i))

  if (i == 1) m <- cbind(s, m)
  else m <- cbind(t(s), m)

})

或者更加紧凑,使用 outer,在两个 for 循环向量的边缘运行:

matrix_list3 <- lapply(1:3, function(i) {      
  n = 5^i
  m <- matrix(data=0, nrow=n, ncol=n-i)      
  m <- cbind(outer(1:n, 1:i, `+`), m)      
})

all.equal(matrix_list, matrix_list2)
# [1] TRUE

all.equal(matrix_list, matrix_list3)
# [1] TRUE

嗨,我写了一个简单的方法来创建我的矩阵(m[j,k]=j+k)。在这种情况下,我认为我可以使用你们所有的答案。如果我有一个更复杂的矩阵,我可能只能使用第一种选项,比如@Rushabh所说的。 - liguang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接