다음의 예에서 보듯이 행렬x의 대각선 오른편 (Upper)만 보이게 하고 나머지는 0으로 표기하는 방법은?
> x <- matrix( 1:25, nrow=5, ncol=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
즉 다음과 같이...
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 0 7 12 17 22
[3,] 0 0 13 18 23
[4,] 0 0 0 19 24
[5,] 0 0 0 0 25
내가 아는 가장 간단한 방법은
Cholesky decomposition
그런데 계산과정에서 분리된 행렬값이 항상 양(+)의 값이 나와야 한다는 제약이 있다.
그리고 불행히도 저의 x 행렬이 그러한 케이스라 chol(x)로는 계산이 불가하다. "Error in chol.default(x) :
the leading minor of order 2 is not positive definite"
물론 시간을 두고 함수를 만드는 코딩을 하면 억지로 구할 수도 있지만 나는 그럴 여유가 많지않다. 해서 다른 함수를 찾아보니 upper.tri(), lower.tri() 가 있다.
그래서 upper.tri(x)로 실행을 해보니
upper.tri(x)*x
[,1] [,2] [,3] [,4] [,5]
[1,] 0 6 11 16 21
[2,] 0 0 12 17 22
[3,] 0 0 0 18 23
[4,] 0 0 0 0 24
[5,] 0 0 0 0 0
내가 찾는 정답은 대각선을 기준으로 오른편 숫자들을 구하는 것인데, 이 공식으로는 대각선도 0으로 지워진다. 그래서 좀 더 뒤져보니
> upper.tri(x,diag=TRUE)*x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 0 7 12 17 22
[3,] 0 0 13 18 23
[4,] 0 0 0 19 24
[5,] 0 0 0 0 25
다행히 "대각선을 포함하라"라는 Option을 선택하니 내가 찾고자 하는 정답을 구할 수 있었다. "diag=TRUE" 즉 diagnal 을 삽입해라~~~
시간을 많이 벌어주는 유용한 함수다.