从预览操作递归地求和矩阵

时间:2016-09-27 04:26:37

标签: r function matrix repeat

具有以下矩阵和向量:

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

此操作与此答案Multiply recursiverly in r类似。但是,它使用预览操作的结果来计算下一个。

1 个答案:

答案 0 :(得分:1)

这是一个递归功能,可以完成你之后的工作,

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