【问题标题】:Lag per rows of a matrix in RR中矩阵的每行滞后
【发布时间】:2019-09-09 23:14:56
【问题描述】:

我想构造一个如下所示的矩阵:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,]    1    0    0   -1    0    0    0    0    0     0     0     0     0     0     0     0
[2,]    0    0    0    1    0    0   -1    0    0     0     0     0     0     0     0     0
[3,]    0    0    0    0    0    0    1    0    0    -1     0     0     0     0     0     0
[4,]    0    0    0    0    0    0    0    0    0     1     0     0    -1     0     0     0
[5,]    0    0    0    0    0    0    0    0    0     0     0     0     1     0     0    -1

我正在考虑的方式,虽然有点不太好,是创建一个包含一个模式的向量,该模式将重复填充,逐行,矩阵

pattern <- c(1,rep(0,2),-1,rep(0,15)) #creating the pattern 
matrix(rep(pattern, 5), 5, 16, byrow = TRUE) #filling a matrix per row with repetitions of the pattern
#Returns:
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,]    1    0    0   -1    0    0    0    0    0     0     0     0     0     0     0     0
[2,]    0    0    0    1    0    0   -1    0    0     0     0     0     0     0     0     0
[3,]    0    0    0    0    0    0    1    0    0    -1     0     0     0     0     0     0
[4,]    0    0    0    0    0    0    0    0    0     1     0     0    -1     0     0     0
[5,]    0    0    0    0    0    0    0    0    0     0     0     0     1     0     0    -1
Warning message:
In matrix(rep(pattern, 5), 5, 16, byrow = TRUE) :
  data length [95] is not a sub-multiple or multiple of the number of columns [16]

这给了我我想要的东西,但当然有一个警告,因为我没有使用结果模式重复的所有元素。

我在想的另一种方式是,使用kronecker 产品并有类似的东西:

kronecker(diag(5),t(c(1,rep(0,2),-1)))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]    1    0    0   -1    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0
[2,]    0    0    0    0    1    0    0   -1    0     0     0     0     0     0     0     0     0     0     0     0
[3,]    0    0    0    0    0    0    0    0    1     0     0    -1     0     0     0     0     0     0     0     0
[4,]    0    0    0    0    0    0    0    0    0     0     0     0     1     0     0    -1     0     0     0     0
[5,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     1     0     0    -1

然后根据每行(从第二行开始)向左移动/滞后,直到获得我正在寻找的结果。在不使用lag 的情况下,有没有办法实现这种转变?或任何建议/替代解决方法?谢谢

【问题讨论】:

    标签: r matrix lag shift


    【解决方案1】:

    1) 设置一维元素

    m1 <- matrix(0, 5, 16)
    m1[seq(1, length(m1), 16)] <- 1
    m1[seq(16, length(m1), 16)] <- -1
    

    2) 设置二维元素

    m2 <- matrix(0, 5, 16)
    m2[cbind(1:5, seq(from = 1, length = 5, by = 16 %/% 5))] <- 1
    m2[cbind(1:5, seq(to = 16, length = 5, by = 16 %/% 5))] <- -1
    

    3) 从诊断设置

    len <- 5 * 16
    d <- c(diag(16 - 1))
    m3 <- matrix(head(d, len) - tail(d, len), ncol = 16)
    

    【讨论】:

      【解决方案2】:

      这是一个使用 for 循环的解决方案,但我认为应该可以实现更简单、更快速的解决方案 -

      m <- matrix(0, nrow = 5, ncol = 16)
      
      colnum <- seq(1, by = 3, length.out = nrow(m))
      
      for(i in 1:nrow(m)) {
        m[i, colnum[i]:(colnum[i]+3)] <- c(1, 0, 0, -1)
      }
      
      m
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
      [1,]    1    0    0   -1    0    0    0    0    0     0     0     0     0     0     0     0
      [2,]    0    0    0    1    0    0   -1    0    0     0     0     0     0     0     0     0
      [3,]    0    0    0    0    0    0    1    0    0    -1     0     0     0     0     0     0
      [4,]    0    0    0    0    0    0    0    0    0     1     0     0    -1     0     0     0
      [5,]    0    0    0    0    0    0    0    0    0     0     0     0     1     0     0    -1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多