【问题标题】:Creating a matrix using recycling使用回收创建矩阵
【发布时间】:2020-10-25 08:43:42
【问题描述】:

我被要求作为练习使用回收来启动一个 4 x 5 矩阵,其中前三行是 0,第四行是 4、8、12、16、20。

我了解回收的定义是,如果数学运算中两个向量的长度不匹配,则重复较短的向量,直到其长度与较大向量的长度匹配。我试图通过以下和其他相同的方式创建一个矩阵。

x = matrix(0,nrow=4,ncol=5) + c(4,8,12,16,20) 

当然这是不正确的,所以我想知道我在这里缺少什么。任何帮助表示赞赏。

【问题讨论】:

  • matrix(1:20*(1:20%%4==0), nrow=4)

标签: r matrix recycle


【解决方案1】:

当在向量参数上调用时,rbind 返回一个矩阵并回收太短的向量,从而实现简单而优雅的解决方案:

rbind(0, 0, 0, c(4, 8, 12, 16, 20))

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    0    0    0    0
# [2,]    0    0    0    0    0
# [3,]    0    0    0    0    0
# [4,]    4    8   12   16   20

【讨论】:

  • 有没有办法使用回收和只有matrix()函数?
【解决方案2】:

使用模数 (%%):

matrix(1:20 * (1:20 %% 4 == 0), nrow = 4)

写得更笼统一些:

nr = 4
nc = 5
v = seq(nr * nc)
matrix(v * (v %% nr == 0), nrow = nr)

【讨论】:

    【解决方案3】:

    如果意图是 replace 最后一行,请使用带有行/列索引的 replace

    replace(matrix(0,nrow=4,ncol=5), cbind(4, 1:5), c(4,8,12,16,20))
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    0    0    0    0    0
    #[2,]    0    0    0    0    0
    #[3,]    0    0    0    0    0
    #[4,]    4    8   12   16   20
    

    或者做作业

    m1 <- matrix(0,nrow=4,ncol=5)
    m1[nrow(m1),] <- c(4,8,12,16,20)
    

    或者如果我们需要使用+

    matrix(0, nrow=4, ncol=5) + 
          do.call(rbind, rep(list(0, c(4, 8, 12, 16, 20)), c(3, 1)))
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    0    0    0    0    0
    #[2,]    0    0    0    0    0
    #[3,]    0    0    0    0    0
    #[4,]    4    8   12   16   20
    

    或者另一种选择是将回收的逻辑向量与值的replicated 向量相乘以将值更改为0,然后构造matrix

    matrix(rep(c(4, 8, 12, 16, 20), each = 4) * c(FALSE, FALSE, FALSE, TRUE), 4, 5)
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    0    0    0    0    0
    #[2,]    0    0    0    0    0
    #[3,]    0    0    0    0    0
    #[4,]    4    8   12   16   20
    

    【讨论】:

      【解决方案4】:

      这是另一个使用矩阵乘法和向量的版本:

      matrix(rep(c(0,0,0,1),5),ncol=5)* c(16,12,8,4,20)
      
      
           [,1] [,2] [,3] [,4] [,5]
      [1,]    0    0    0    0    0
      [2,]    0    0    0    0    0
      [3,]    0    0    0    0    0
      [4,]    4    8   12   16   20
      

      ...还有另一个版本:

      t(matrix(c(rep(0,15),rep(1,5)),ncol=4) * c(4,8,12,16,20))
      
      
           [,1] [,2] [,3] [,4] [,5]
      [1,]    0    0    0    0    0
      [2,]    0    0    0    0    0
      [3,]    0    0    0    0    0
      [4,]    4    8   12   16   20
      

      【讨论】:

        猜你喜欢
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2014-06-20
        • 1970-01-01
        相关资源
        最近更新 更多