用 R 构建约束矩阵

Constructing a constraint matrix with R

我想构建以下矩阵以在 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)
}

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

可能与此类似:

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

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

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

一个简单的基础 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
``