r - 对角块矩阵行之间的组合列表
问题描述
我有以下 R 矩阵,它是 2x3 和 3x3 子矩阵的组合,它可以是超过 2 个不同维度的子矩阵(例如 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
我想获得第一个子矩阵和第二个子矩阵之间的所有行索引组合来解决线性优化问题。组合必须来自两个子矩阵,然后求解新的 beta,然后检查条件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 函数,但它没有给我想要的输出。
解决方案
一种可能的基础 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))
})
推荐阅读
- javascript - Webpack 5.47.1:配置对象无效。Webpack 已使用与 API 架构不匹配的配置对象进行初始化
- node.js - 即使 Expressjs 中存在错误处理程序,AWS 也会显示它自己的错误屏幕
- apache-flink - Flink 1.13 中时态表的文档在哪里?
- angular - Ngrx 存储值未显示在组件模板中
- java - 如何在 Java 中返回 3x6 矩阵的所有可能结果?
- qt - QT 或 QML:在移动应用程序中捕获应用程序关闭事件
- python-3.x - GCP 功能部署功能失败
- office-js - 在 MAC New UI 的单独窗口中弹出撰写窗口时,AddFileAttachmentAsync 返回 5005
- azure-devops - 如何列出/回显 Azure 管道中定义的所有变量?
- amazon-web-services - dynamodb 的细粒度访问控制不适用于 LeadingKeys:${aws:username}