【问题标题】:How can I create this exact 5x5 matrix using only for loops?如何仅使用 for 循环创建这个精确的 5x5 矩阵?
【发布时间】:2022-01-12 16:16:43
【问题描述】:
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

所以我得到了这个矩阵,并被告知只使用 for 循环来创建它。到目前为止我所做的是使用cbind(0:4,1+(0:4),2+(0:4),3+(0:4),4+(0:4)),但我无法找到使用 for 函数的方法。

【问题讨论】:

    标签: r for-loop matrix


    【解决方案1】:

    一种方式:

    mat <- matrix(0L, nrow=5, ncol=5) 
    for (i in 0:4) {
      for (j in 0:4) {
        mat[i + 1, j + 1] <- i + j
      }
    }
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    0    1    2    3    4
    # [2,]    1    2    3    4    5
    # [3,]    2    3    4    5    6
    # [4,]    3    4    5    6    7
    # [5,]    4    5    6    7    8
    

    从技术上讲,*apply 函数也是循环:

    sapply(0:4, \(x) 0:4 + x)
    

    【讨论】:

    • sapply(0:4, \(x) 0:4 + x) 确实是最优雅的解决方案,即使它可能无法满足(我假设)作业要求。
    【解决方案2】:

    另一种方式:

    mymat <- matrix(NA, nrow = 5, ncol = 5)
    i_mat <- 1
    for (i in 0:4) {
      mymat[seq(i_mat, i_mat + 4)] <- seq(i, i + 4)
      i_mat <- i_mat + 5
    }
    mymat
    
         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    1    2    3    4
    [2,]    1    2    3    4    5
    [3,]    2    3    4    5    6
    [4,]    3    4    5    6    7
    [5,]    4    5    6    7    8
    

    【讨论】:

    • “另一种方式”——对 R 的一个很好的描述。几乎总是有多种方法可以做同样的事情。
    【解决方案3】:

    你走在正确的轨道上。如果你重写你当前的

    cbind(0:4,1+(0:4),2+(0:4),3+(0:4),4+(0:4))
    

    作为

    cbind(0+(0:4),1+(0:4),2+(0:4),3+(0:4),4+(0:4))
    

    您可能会注意到,您添加到 0:4 的内容隐含地是一个循环索引。

    明确说明:

    m = c()
    for(i in 0:4){
      m = cbind(m,i+(0:4))
    } 
    print(m)
    

    输出:

         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    1    2    3    4
    [2,]    1    2    3    4    5
    [3,]    2    3    4    5    6
    [4,]    3    4    5    6    7
    [5,]    4    5    6    7    8
    

    【讨论】:

    • 感谢大家的回答,他们非常有帮助!我想知道如何在上面创建这个精确的矩阵,这次不使用 for 循环,而是专门使用矩阵运算。再次提前感谢大家花时间回答
    • @mxalbeta for 循环不是通常构造这样的矩阵的方式,但是如何在没有循环的情况下这样做实际上是一个不同的问题。也许您可以在这里接受其中一个答案(哪一个对您帮助最大),然后提出一个全新的问题。
    【解决方案4】:

    您可以先创建一个空矩阵,然后用两个遍历行和列的 for 循环填充它。稍微玩弄一下变量以写入矩阵 (count),我发现这是一个合适的解决方案。

    matrix2fill <- matrix(NA, 5,5)
    count = 0
    for (i in 1:5){
      for (j in 1:5){
        matrix2fill[j,i] = count
        count = count + 1
      }
      count = i
    }
    
    matrix2fill
         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    1    2    3    4
    [2,]    1    2    3    4    5
    [3,]    2    3    4    5    6
    [4,]    3    4    5    6    7
    [5,]    4    5    6    7    8
    

    【讨论】:

      【解决方案5】:

      试试这个:

      a = matrix(1:25, nrow=5, ncol=5) 
      for (i in 1:5) {
         for (j in 1:5) {
            a[i][j] = (i-1) + (j-1)
         }
      }
      print(a)
      

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        相关资源
        最近更新 更多