【问题标题】:Save n matrix in loop R在循环R中保存n矩阵
【发布时间】:2023-03-22 12:01:01
【问题描述】:

我是 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
    }
  }
}

有人可以帮忙吗?

谢谢

【问题讨论】:

    标签: r loops matrix


    【解决方案1】:

    通过将矩阵存储到列表中来试试这个。

    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
      

      【讨论】:

        【解决方案3】:

        考虑 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 之类的第一个选项
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 2012-02-21
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多