Вычислить по строке матрицу 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