본 포스트에서는 각종 특수 행렬을 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이 사용된다는 것을 알 수 있다.
'프로그래밍언어.Lib > MATLAB' 카테고리의 다른 글
MATLAB의 상수와 내부 변수들 (0) | 2015.06.25 |
---|---|
MATLAB의 문자열(string)과 관련 함수 (0) | 2015.06.25 |
MATLAB 행렬의 크기 구하기 (3) | 2015.06.25 |
MATLAB 의 행렬의 인덱싱 방법 (part 3) (0) | 2015.06.24 |
MATLAB 의 행렬의 인덱싱 방법 (part 2) (0) | 2015.06.24 |