본 포스트에서는 각종 특수 행렬을 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 1
1 1
1 1
>> A = zeros(2,3)
A =
0 0 0
0 0 0


만약 다음과 같은 행렬 A를 만들고 싶다면

A=2*ones(2,3)이라고 명령을 내리면 된다.

항등행렬 (identity matrix)

 항등행렬은 eye(n) 함수로 만들 수 있다.


>> eye(5)
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 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    0
   0   22    0
   0    0   33


다른 예를 들어  diag(ones(1,n)) 명령은 아래와 같은 n☓n 항등행렬을 생성한다.


>> diag(ones(1,5))
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 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 =
1
5
9

>> diag(diag(A))
ans =
1 0 0
0 5 0
0 0 9


 다른 예를 더 살펴보자.


>> diag(1:5)
ans =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5

>> diag(0:4)
ans =
0 0 0 0 0
0 1 0 0 0
0 0 2 0 0
0 0 0 3 0
0 0 0 0 4


따라서 diag(1:5)-diag(0:4)는 다음과 같이 항등행렬이다.


>> diag(1:5)-diag(0:4)
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 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    0
   0    0   22    0
   0    0    0   33
   0    0    0    0

>> diag([11,22,33],-2)
ans =
   0    0    0    0    0
   0    0    0    0    0
  11    0    0    0    0
   0   22    0    0    0
   0    0   33    0    0


따라서 두 번째 n이 생략되면 기본값으로 0이 사용된다는 것을 알 수 있다.



Posted by 살레시오
,