请参阅随附的代码
A <- matrix(c(1,1,1,-1,1,-1,2,3,-1,2,-1,-2),nrow = 4,byrow = TRUE)
b <- matrix(c(0,5,2,4),nrow = 4)
beta <- c(0,5,3)
r <- nrow(A)
iTBD <- 2
s <- seq_len(r)[-i]
for(iWs in s){
Aq <- A[iWs, ,drop=FALSE]
print(Aq)
bq <- b[iWs, ,drop=FALSE]
m <- nrow(Aq)
is.ind <- sum(Aq%*%beta) == sum(bq)
print(iWs)
print(is.ind)
if(is.ind) break
}
我正在实现一种算法
1)我必须选择不在iTBD中的矩阵A的每一行,并且
a)检查是否满足条件,然后打破
b)如果不满足条件,我需要创建所有可能的不同 c(1,3),c(1,4),c(3,4)等行的组合,并运行for循环 如果条件再次满足,则在特定的行组合处停止
c)如果(a)和(b)不起作用,那么我必须采用完整的行组合 c(1,3,4)并检查条件 如果(1)不满足条件,则转到步骤(2)
2)将iTBD添加到行中,然后
a)取(1.a)中的两行组合,并检查是否满足条件 不要转到下面的步骤b
b)取不属于(1.c)的所有3行组合,并检查条件是否为 如果没有,请转到步骤c belwo
c)取完整的矩阵A并检查条件
我的问题是如何在循环中使用组合?我的意思是先单独处理每一行,然后再组合两行,依此类推,直到满足条件为止。
谢谢
答案 0 :(得分:1)
我无法完全理解您的问题,但是这些信息肯定会对您有所帮助。
您可以使用library(combinat)
的此功能逐个循环生成所有组合。
矩阵的每一列代表一次组合,一次从矢量c(1,2,3,4,5)中提取i个(这里i = 2)元素。
现在您可以使用这些方法产生预期的结果。
for (i in 1:n){
combinat::combn(x = c(1,2,3,4,5), m = i) # store the combinations in a list and use accordingly.
}
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 1 1 1 1 2 2 2 3 3 4
#> [2,] 2 3 4 5 3 4 5 4 5 5