$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이 된다.


1
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이란 함수로 실행시키는 방식으로 한다.


1
2
3
4
5
6
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$를 만들 수 있다.


1
2
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$를 만들 수 있다.


1
2
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$가 완성된다.


1
A = AL + AD + AU;








Reference)

http://jasonjuang.blogspot.kr/2014/07/how-to-create-block-diagonal-matrix.html

http://stackoverflow.com/questions/16370371/matlab-create-a-block-diagonal-matrix-with-same-repeating-block




+ Recent posts