迭代和顺序更改

时间:2018-06-29 04:46:58

标签: r

请参阅随附的代码

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并检查条件

我的问题是如何在循环中使用组合?我的意思是先单独处理每一行,然后再组合两行,依此类推,直到满足条件为止。

谢谢

1 个答案:

答案 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