본 포스트에서는 각종 특수 행렬을 MATLAB 내부 함수를 이용하여 생성하는 방법을 알아본다. 앞으로 첨자로 쓰이는 m,n은 양의 정수를 표기한다. 이전에 소개되었던 특수한 행렬을 생성하는 함수들은 다음 표에 정리하였다.
[표 1] 이전에 소개되었던 특수 행렬을 반환하는 함수들 요약
함수
|
기능
|
maginc(n)
|
nxn 크기의 매직 행렬(임의읭 행이나 열의 요소 합이 동일) 생성
|
rand(n)
rand(m,n)
randn(n)
randn(m,n)
|
nxn 크기의 난수 행렬 생성
mxn 크기의 난수 행렬 생성
nxn 크기의 정규 분포(normally distributed) 난수 행렬 생성
mxn 크기의 정규 분포(normally distributed) 난수 행렬 생성
|
pascal(n)
|
nxn 크기의 파스칼 행렬 생성
|
이것들 이외의 함수들에 대해서 살펴보도록 하겠다.
영행렬과 일행렬
MATLAB에서 다음 함수들은 특수한 행렬을 만들어낸다.
[표 2] ones()와 zeros() 함수
함수
|
기능
|
ones(n)
ones(m,n)
ones(size(A))
|
nxn 크기의 ‘1’로 채워진 행렬 생성
mxn 크기의 ‘1’로 채워진 행렬 생성
A행렬의 크기와 같은 ‘1’로 채워진 행렬 생성
|
zeros(n)
zeros(m,n)
zeros(size(A))
|
nxn 크기의 ‘0’으로 채워진 행렬 생성
mxn 크기의 ‘0’으로 채워진 행렬 생성
A행렬의 크기와 같은 ‘0’으로 채워진 행렬 생성
|
예를 들면 다음과 같다.
>> A = ones(3,2)A =1 11 11 1>> A = zeros(2,3)A =0 0 00 0 0 |
만약 다음과 같은 행렬 A를 만들고 싶다면
A=2*ones(2,3)이라고 명령을 내리면 된다.
항등행렬 (identity matrix)
항등행렬은 eye(n) 함수로 만들 수 있다.
>> eye(5)ans =1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1 |
만약 다음과 같은 행렬 A를 만들고 싶다면
A=-eye(3)이라고 명령을 내리면 된다.
대각행렬 (diagonal matrix)
[표 3] diag() 함수의 기능과 용례들
함수
|
기능
|
용례
|
diag(x)
|
x의 요소들을 주대각 요소로 하는 정방행렬 생성
|
diag([11,22])
diag(3:10)
|
diag(x,n)
|
x의 요소들을 부대각 요소로 하는 정방행렬 생성
(n==0일 때 주대각 요소)
|
diag([1 2 3],2)
diag(x, -1)
|
diag(A)
|
행렬 A의 주대각 요소를 뽑아 열벡터 생성
|
diag(magic(3))
|
diag(A,n)
|
행렬 A의 부대각 요소를 뽑아 열벡터 생성
(n==0일 때 주대각 요소)
|
diag(A, 2)
diag(A, -1)
|
만약 x를 벡터라고 하면 명령문 diag(x)는 대각선상에 x를 갖는 대각행렬을 만든다.
>> x=[11 22 33]x =11 22 33>> diag(x)ans =11 0 00 22 00 0 33 |
다른 예를 들어 diag(ones(1,n)) 명령은 아래와 같은 n☓n 항등행렬을 생성한다.
>> diag(ones(1,5))ans =1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1 |
만약 A가 정방행렬이면 diag(A)는 A의 대각선 원소들로 생성되는 벡터이고, diag(diag(A))는 diag(A)의 원소를 대각선상에 갖는 대각 행렬이다. 아래의 명령을 살펴보자.
>> A = [1 2 3; 4 5 6; 7 8 9];>> diag(A)ans =159>> diag(diag(A))ans =1 0 00 5 00 0 9 |
다른 예를 더 살펴보자.
>> diag(1:5)ans =1 0 0 0 00 2 0 0 00 0 3 0 00 0 0 4 00 0 0 0 5>> diag(0:4)ans =0 0 0 0 00 1 0 0 00 0 2 0 00 0 0 3 00 0 0 0 4 |
따라서 diag(1:5)-diag(0:4)는 다음과 같이 항등행렬이다.
>> diag(1:5)-diag(0:4)ans =1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1 |
마찬가지로 diag(3:7)-diag(2:6)의 결과도 항등행렬이다.
일반적으로 diag(x,n)은 x원소을 n번째 대각선에 위치시킨다. n이 0이면 주대각선을 n>0이면 그 위의 대각선, n<0이면 그 밑의 대각선을 지정한다. 그리고 diag()함수의 반환 행렬은 항상 정방행렬이다.
>> diag([11,22,33],1)ans =0 11 0 00 0 22 00 0 0 330 0 0 0>> diag([11,22,33],-2)ans =0 0 0 0 00 0 0 0 011 0 0 0 00 22 0 0 00 0 33 0 0 |
따라서 두 번째 n이 생략되면 기본값으로 0이 사용된다는 것을 알 수 있다.
댓글 없음:
댓글 쓰기