Построение матрицы ограничений с помощью R - PullRequest
3 голосов
/ 18 апреля 2020

Я хотел бы построить следующую матрицу для моделирования ILP в R. Фактическое значение переменных на самом деле не имеет значения, важны следующие свойства.

Я хотел бы построить матрицу с 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)
}

Мне было интересно, могу ли я построить эту матрицу, используя немного более векторизованный подход?

Ответы [ 3 ]

3 голосов
/ 18 апреля 2020

Простое базовое решение 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
`` 
1 голос
/ 18 апреля 2020

Векторизованный подход к генерации матрицы будет состоять в том, чтобы сначала построить 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
0 голосов
/ 18 апреля 2020

Может быть, что-то похожее на это:

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