Список комбинаций между рядами диагональной блочной матрицы - PullRequest
0 голосов
/ 22 января 2019

У меня есть следующая матрица R, которая является комбинацией подматриц 2x3 и 3x3, и это может быть более 2 подматриц с различным измерением (например, m1xp и m2xp и m3xp, где каждый из m1, m2, m3 <= p) </p>

A2 <- list(rbind(c(1,1,1),c(-1,1,-1)),
           rbind(c(-1,1,1),c(1,-1,2),c(2,-1,2)))
library(Matrix)
A2 <- as.matrix(Matrix::bdiag(A2))
Rhs <- matrix(c(0,5,0.5,4),nrow = 4)
beta <- c(rep(1.2,3),c(0.5,0.2,0.1))
> A2
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    0    0    0
[2,]   -1    1   -1    0    0    0
[3,]    0    0    0   -1    1    1
[4,]    0    0    0    1   -1    2
[5,]    0    0    0    2   -1    2

Я бы хотел получить комбинацию всех индексов строк между первой подматрицей и второй подматрицей для решения задачи линейной оптимизации. Комбинация должна быть из обеих подматриц, затем найти новую бета-версию и затем проверить, удовлетворяется ли условие Aq %*% beta == Rhs, остановить. Если нет, тогда возьмите другую комбинацию. Я думаю, что ниже все комбинации строк между субматрицами:

Комбинация как одна из первой субматрицы и одна из второй субматрицы

Aq <- A2[c(1,3),]
Aq <- A2[c(1,4),]
Aq <- A2[c(1,5),]
Aq <- A2[c(2,3),]
Aq <- A2[c(2,4),]
Aq <- A2[c(2,5),]

Затем комбинация как одна из первой и 2 из второй матрицы

Aq <- A2[c(1,3,4),]
Aq <- A2[c(1,3,5),]
Aq <- A2[c(1,4,5),]
Aq <- A2[c(2,3,4),]
Aq <- A2[c(2,3,5),]
Aq <- A2[c(2,4,5),]

Затем комбинация как одна из первой и 3 из второй матрицы

Aq <- A2[c(1,3,4,5),]
Aq <- A2[c(2,3,4,5),]

Затем комбинация как 2 из первой и одной из второй матрицы

Aq <- A2[c(1,2,3),]
Aq <- A2[c(1,2,4),]
Aq <- A2[c(1,2,5),]

Затем комбинация как 2 из первой и 2 из второй матрицы

Aq <- A2[c(1,2,3,4),]
Aq <- A2[c(1,2,3,5),]
Aq <- A2[c(1,2,4,5),]

Затем комбинация как 2 из первой и 3 из второй матрицы

Aq <- A2[c(1,2,3,4,5),]

Есть ли лучший способ получить все комбинации? Затем я хотел бы создать цикл, который выбирает по одному на вышеуказанную комбинацию за раз и проверить, если

if (Aq %*% beta == Rhs) {
  break
} else {
  TAKE ANOTHER COMBINATION Aq
}

Обратите внимание, у меня может быть более 2 подматриц, которые создают блочную матрицу. Затем я должен создать все комбинации строк между первой, второй и третьей матрицами. Я надеюсь, что есть простой способ сделать это в R. Я попробовал функцию grid.expand, но она не дает мне желаемого результата.

1 Ответ

0 голосов
/ 22 января 2019

Возможный базовый подход R:

indices1 <- 1:2
indices2 <- 3:5
apply(expand.grid(seq_along(indices1), seq_along(indices2)), 1, 
    function(x) t(apply(
                      expand.grid(combn(indices1, x[1], simplify=FALSE), 
                            combn(indices2, x[2], simplify=FALSE)), 
                  1, unlist)))

вывод:

[[1]]
     Var1 Var2
[1,]    1    3
[2,]    2    3
[3,]    1    4
[4,]    2    4
[5,]    1    5
[6,]    2    5

[[2]]
     Var11 Var12 Var2
[1,]     1     2    3
[2,]     1     2    4
[3,]     1     2    5

[[3]]
     Var1 Var21 Var22
[1,]    1     3     4
[2,]    2     3     4
[3,]    1     3     5
[4,]    2     3     5
[5,]    1     4     5
[6,]    2     4     5

[[4]]
     Var11 Var12 Var21 Var22
[1,]     1     2     3     4
[2,]     1     2     3     5
[3,]     1     2     4     5

[[5]]
     Var1 Var21 Var22 Var23
[1,]    1     3     4     5
[2,]    2     3     4     5

[[6]]
     Var11 Var12 Var21 Var22 Var23
[1,]     1     2     3     4     5

edit: добавление более общей версии:

#identifying the indices
indices <- split(seq_len(nrow(A2)), max.col(abs(A2) > 0, "first"))

#generating the combinations
apply(expand.grid(lapply(indices, seq_along)), 1L, 
    function(idx) {
        t(apply(
            expand.grid(
                lapply(seq_along(idx), 
                    function(k) {
                        combn(indices[[k]], idx[k], simplify=FALSE)
                    })),
            1L, unlist))
    })
...