r-对角块矩阵行之间的组合列表



我有下面的R矩阵,它是2x3和3x3子矩阵的组合,它可以是两个以上不同维度的子矩阵(例如m1xp和m2xp以及m3xp,其中m1、m2、m3<=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),]

然后,组合为来自第一矩阵的1和来自第二矩阵 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),]

然后,组合为来自第一矩阵的1和来自第二矩阵 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.extend函数,但它并没有给我想要的输出。

一种可能的基本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

编辑:添加更通用的版本:

#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))
})

相关内容

  • 没有找到相关文章

最新更新