2015-01-27 18 views
6

Bir vektör verildiğinde, vektörün elemanları diyagonal olan ve sıralı cumsum elemanları olan bir kare matris oluşturmak istiyorum.Çizgisel matris cumsum vektöründen hesapla

Örnek vektör:

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

Gerekli çıkışı:

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 
} 

ne olacağını R yönlü (görmemeye: Artık

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

, ben döngü fonksiyonu için çift kullanıyorum Bunu yapmak)?

cevap

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

Ha, daha hızlı lower.tri çözeltisiyle vardı :) –

4

bir yolu bunu yapmak için: Bunun gibi

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