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