【问题标题】:Constructing a constraint matrix with R用 R 构造约束矩阵
【发布时间】:2020-08-01 02:17:43
【问题描述】:

我想为 R 中的 ILP 建模构建以下矩阵。变量的实际含义并不真正相关,相关的是以下属性。

我想用n 构造一个矩阵,列数为n x m

对于第一行,我想要n (从位置 0 开始)。

对于第二行,我想先将n 设为零,然后将n 设为零,其余列设为零。

对于第三行,我希望将 n x 2 设为零,然后将 n 设为零,其余列设为零。

这种情况一直持续到我在开头有 n x (m-1) 零和在末尾有 n

矩阵的小演示如下:

1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1

生成这个矩阵的代码是:

f.con <- matrix(0, nrow = 3, ncol = 12)
for(i in 1:3){
  f.con[i,((i-1)*4+1):(4*i)] <- rep(1, 4)
}

我想知道是否可以使用更矢量化的方法来构造这个矩阵?

【问题讨论】:

    标签: r matrix vectorization


    【解决方案1】:

    一个简单的基础 R 解决方案是使用 kronecker

    nr <- 3
    nc <- 12
    f.con <- kronecker(diag(nr),t(rep(1,nc/nr)))
    

    这样

    > f.con
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
    [1,]    1    1    1    1    0    0    0    0    0     0     0     0
    [2,]    0    0    0    0    1    1    1    1    0     0     0     0
    [3,]    0    0    0    0    0    0    0    0    1     1     1     1
    `` 
    

    【讨论】:

      【解决方案2】:

      生成矩阵的矢量化方法是首先构建一个 0 矩阵,然后根据列数和行数创建行/列索引以分配 1。

      nr <- 3
      nc <- 12
      f.con <- matrix(0, nrow = nr, ncol = nc)
      f.con[cbind(rep(seq_len(nr), each = nc/nr), seq_len(nc))] <- 1
      
      f.con
      #     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
      #[1,]    1    1    1    1    0    0    0    0    0     0     0     0
      #[2,]    0    0    0    0    1    1    1    1    0     0     0     0
      #[3,]    0    0    0    0    0    0    0    0    1     1     1     1
      

      【讨论】:

        【解决方案3】:

        可能是这样的:

        x <- rep(rep(c(1,0), c(4,12)), 3)[1:(3*12)]
        matrix(x, ncol=12, byrow=TRUE)
        

        【讨论】:

          猜你喜欢
          • 2013-11-29
          • 1970-01-01
          • 2014-08-15
          • 2015-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多