从预览操作递归求和矩阵

Sum matrix recursively from previews operations

具有以下矩阵和向量:

a<-matrix(c(1,4,7,
        2,5,8,
        3,6,9), nrow = 3)
b <- c(1,1,1)

如何在函数内部对矩阵的每一行递归求和直到获得所需的结果使用上一个结果计算下一个操作 如图:

b<-b+a[1,]
b<-b+a[2,]
b<-b+a[3,]
b<-b+a[1,]
b<-b+a[2,]

sum(b)>100 # Sum recursiverly till obtain this result sum(b)>100

此操作看起来与此答案相似 。但是它使用预览操作的结果来计算下一个。

这是一个递归函数来完成你想要的,

# Sample Data
a<-matrix(c(1,4,7,
        2,5,8,
        3,6,9), nrow = 3)
b <- c(1,1,1)

我们创建一个引用自身的函数,该函数以行数为模递增的值

recAdd <- function(b, a, start = 1, size = NROW(a)) {
  if(sum(b) > 100) return(b)
  return(recAdd(b + a[start,], a, start = start %% size + 1, size))
}

> recAdd(b,a)
[1] 30 38 46

编辑:或者,这里有一种完全没有递归的方法,它在目标数与矩阵总和的比率较大时要快得多(但在这种大小的数据上速度较慢)。基本上我们可以利用 Euclid

nonrecAdd <- function(b, a, target = 100) {
  Remaining <- target - sum(b)
  perloop <- sum(a)
  nloops <- Remaining %/% perloop
  Remaining <- Remaining %% perloop
  if(Remaining > 0) {
    cumulativeRowsums <- cumsum(rowSums(a))
    finalindex <- which((Remaining %/% cumulativeRowsums) == 0)[1]
    b + colSums(a) * nloops +  colSums(a[1:finalindex,,drop = FALSE])
  } else {
    b + colSums(a) * nloops
  }
}