Вычислить по строке матрицу cumsum из вектора

дан вектор я хотел бы создать квадратную матрицу, где элементы вектора находятся по диагонали и есть построчный cumsum элементов.

пример вектора:

vec <- c(1, 2, 3, 4)

требуются выхода:

     [,1] [,2] [,3] [,4]
[1,]    1    3    6   10
[2,]    0    2    5    9
[3,]    0    0    3    7
[4,]    0    0    0    4

Теперь я использую функцию double for loop:

diagSum <- function(vec) {
  mat <- diag(vec)
  for (i in seq(nrow(mat))) {
    for (j in seq(i, ncol(mat))) {
      if (j > i) {
        mat[i, j] <- mat[i, j - 1] + mat[j, j]      
      }
    }
  }
  mat
}

что будет R-way (избегая для циклов) делать это?

3 ответов


m <- matrix(vec, nrow = length(vec), ncol = length(vec), byrow =TRUE)
m[lower.tri(m)] <- 0
t(apply(m, 1, cumsum))
#     [,1] [,2] [,3] [,4]
#[1,]    1    3    6   10
#[2,]    0    2    5    9
#[3,]    0    0    3    7
#[4,]    0    0    0    4

один из способов сделать это:

x <- c(1, 2, 3, 4)
rbind(cumsum(x), t(sapply(1:3, function(y) c(rep(0, y), cumsum(x[-(1:y)])) )))
#       [,1] [,2] [,3] [,4]
# [1,]    1    3    6   10
# [2,]    0    2    5    9
# [3,]    0    0    3    7
# [4,]    0    0    0    4

такой:

> x=c(1, 2, 3, 4)

> do.call(rbind, lapply(1:length(x)-1, function(u) {x[0:u]=0;cumsum(x)}))
#     [,1] [,2] [,3] [,4]
#[1,]    1    3    6   10
#[2,]    0    2    5    9
#[3,]    0    0    3    7
#[4,]    0    0    0    4