2015-01-27 14 views
6

से पंक्ति-वार मैट्रिक्स cumsum की गणना करें एक वेक्टर को देखते हुए मैं एक वर्ग मैट्रिक्स बनाना चाहता हूं जहां वेक्टर के तत्व विकर्ण पर हैं और तत्वों की पंक्ति-आधारित cumsum है।वेक्टर

उदाहरण वेक्टर:

vec <- c(1, 2, 3, 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 
} 

क्या होगा आर-तरफा (के लिए परहेज:

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

अब, मैं पाश समारोह के लिए डबल का उपयोग कर रहा लूप) ऐसा करने के लिए?

उत्तर

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