2015-01-27 3 views
6

벡터가 주어진다면, 벡터의 요소가 대각선에 있고 행렬이있는 요소가있는 정사각형 행렬을 만들고 싶습니다.벡터에서 행렬 행렬의 누적을 계산하십시오.

예 벡터 :

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 
} 

어떤 것 R-방법 (위해 피 : 이제

 [,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 
관련 문제