$L_i$, $D_i$, $U_i$를 $n \times n$ matrix라 하자. ($1\leq i \leq N$)
매트랩에서 다음과 같은 $Nn \times Nn$ block tridiagonal matrix $A$를 만들어보자.
$$A = \begin{bmatrix} D_1 & U_1 & & \\ L_1 & D_2 & U_2 & & \\ & \ddots & \ddots & \ddots & \\ & & L_{N-2} & D_{N-1} & U_{N-1} \\ & & & L_{N-1} & D_N \end{bmatrix}$$
1. Block Diagonal Matrix 만들기
우선 block diagonal matrix를 만드는 방법부터 생각해본다.
$B_i$를 $n \times n$ matrix라 하자.
매트랩으로 다음과 같은 $Nn \times Nn$ block diagonal matrix $M$를 만든다고 생각해보자.
$$M=\begin{bmatrix} B_{ 1 } & & & & \\ & B_{ 2 } & & & \\ & & \ddots & & \\ & & & B_{ N-1 } & \\ & & & & B_{ N } \end{bmatrix}$$
1-1. $B = B_i = B_j \; \forall i,j$일 경우
kron(kronecker tensor product)이라는 함수를 이용하면 쉽게 할 수 있다.
kron(A,B)에서 A는 B를 하나의 element로 봤을 때의 matrix를 의미하고, B가 block이 된다.
M = kron(speye(N),B);
1-2. 1-1이 아닐 경우
blkdiag(block diagonal)라는 함수를 이용한다.
우선 $B_i$가 Bi로 저장되어 있다고 가정하자.
(cell로 저장하든 일일히 다른 변수명들로 저장하든 이건 알아서 하자)
blkdiag(B1,B2,B3,...)으로 입력하면 되는데 만약 $N = 100$이라 하면 B1부터 B100까지 일일히 쓰는 건 꽤나 효율적이지 못하다.
그래서 for문을 이용해 M = blkdiag(B1,B2,B3,...,BN)이라는 문자형 data를 만든 뒤 eval이란 함수로 실행시키는 방식으로 한다.
mat_input = []; for i = 1:N mat_input = [mat_input sprintf('B%d,',i)]; end mat_input = ['M=blkdiag(' ,mat_input(1:end-1), ');']; eval(mat_input);
또한, 1-1의 경우더라도 repmat을 이용해서 이 방식으로 만들면 kron보다 더 빠르다고 한다.
2. Block Tridiagonal Matrix 만들기
우선 1에서의 방법을 통해 $D_i$로 만든 $Nn \times Nn$ block diagonal matrix $A_D$를 만든다.
만약 $L = L_i = L_j \; \forall i,j$일 경우 1-1의 방법을 응용해 $Nn \times Nn$ block lower diagonal matrix $A_L$을 만든다.
같은 논리로 $U = U_i = U_j \; \forall i,j$일 경우에도 $Nn \times Nn$ block upper diagonal matrix $A_U$를 만들 수 있다.
AL = kron(diag(ones(N-1,1),-1), L); AU = kron(diag(ones(N-1,1),1), U);
아닐 경우 1-2의 방법을 통해 $(N-1)n \times (N-1)n$ block diagonal matrix $A_L$를 만든 뒤 0을 추가해 $Nn \times Nn$ matrix로 확장한다.
역시 같은 논리로 $A_U$를 만들 수 있다.
AL = [zeros(N*n,n); AL zeros(n,(N-1)*n)]; AU = [AU zeros(n,(N-1)*n); zeros(N*n,n)];
그 다음 $A_L$, $A_D$, $A_U$를 다 더하면 block tridiagonal matrix $A$가 완성된다.
A = AL + AD + AU;
Reference)
http://jasonjuang.blogspot.kr/2014/07/how-to-create-block-diagonal-matrix.html
'Programming > Matlab' 카테고리의 다른 글
sort 함수 활용하기 (0) | 2017.04.26 |
---|---|
OS X용 MATLAB에서 MEX C Compiler 변경하기 (0) | 2017.02.26 |
Introduction to Numerical Methods and Matlab Programming for Engineers (0) | 2017.01.20 |