2015-01-27 4 views
6

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

Пример вектор:

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 

Теперь я использую двойной для функции петли:

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-пути (избегая для петли) делать это?

ответ

8
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 
+0

Ха, ты быстрее lower.tri решение :) –

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