在循环R中保存n矩阵

时间:2018-02-01 20:32:48

标签: r loops matrix

我是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 个答案:

答案 0 :(得分:4)

通过将矩阵存储到列表中来尝试此操作。

serviceId

输出 -

@FeignClient(value = "helloworldservice", serviceId = "dev")
public interface MyBigFatHelloWorldServiceProxy{ ... }

答案 1 :(得分: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

答案 2 :(得分: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