본 포스트에서는 각종 특수 행렬을 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 살레시오
,

 프로그램을 작성하다 보면 빈행렬(empty matrix)을 생성할 필요가 가끔씩 생긴다. 즉, 요소가  없는 0x0크기의 빈행렬를 생성하려면 다음과 같이 하면 된다.


>> A = []

 

만약 행렬 A가 이전에 어떤 요소들을 가지고 있었다면 빈행렬을 대입하는 순간 그것들은 지워지고  그 요소를 저장하기 위해 할당되었던 메모리는 반환된다.

특수한 행렬을 생성하는 기본적인 함수들은 다음 표와 같다.


[표 1] 특수 행렬을 생성하는 함수들

eye(), eye(r, c), eye(M)

주대각 요소가 1인 행렬을 생성한다.

zeros(), zeros(r, c), zeros(M)

모든 요소가 0인 행렬 생성

ones(), ones(r, c), ones(M)

모든 요소가 1인 행렬 생성

linspace(c1, c2 [, n])

c1부터 c2까지 n개의 등간격 행벡터 생성. (n이 생략되면 기본적으로 100임) c1, c2 : 복소수 가능

testmatrix(‘magi’, n)

testmatrix(‘frk’, n)

testmatrix(‘hilb’, n)

nxn 매직행렬 생성

nxn Franck행렬 생성

nxn Hilbert행렬의 역행렬 생성

rand(“seed”), rand(“seed”, s)

rand(r, c [ , strKey] )

rand(M [ , strKey] )

seed값을 얻거나 설정한다. (초기에 s=0임)

r x c 크기 혹은 M행렬과 같은 크기의 난수 행렬 생성

strKey : “uniform”, “normal”, “info”

grand

더 다양한 옵션으로 난수행렬 생성

eye(M)은 M행렬과 같은 차수이고 주대각 요소가 1인 행렬을 생성하며 행렬M이 꼭 정방행렬일 필요는 없다. 주의할 점은 eye(10)이라고 입력하면 10x10 행렬이 생성되는 것이 아니라 1x1행렬이 생성된다는 것이다. (10이라는 숫자가 1x1행렬이기 때문) 그리고 덧셈과 뺄셈에서 사용될 때는 더해지는 행렬과 자동으로 같은 차수의 행렬을 생성한다. ones()와 zeros()도 같은 특성을 가진다.

 linspace(c1, c2 [,n])함수는 c1부터 c2까지 등간격으로 n개의 요소를 가지를 행벡터를 생성하는 자주 사용되는 함수이다. 예를 들어서 0부터 2π 까지 100개의 요소를 가지는 행벡터를 생성헤서 vX변수에 대입하려면 다음과 같이 하면 된다.

>> vX =  linspace(0, 2*%pi)

1000개로 개수를 늘리려면 다음과 같이 한다.


>> vX =  linspace(0, 2*%pi, 1000)

 

 한 가지 특이한 것은 c1, c2는 복소수도 가능하다는 것이다. 예를 들어서 c1=1+%i, c2=2+3*%i, n=5라면 간격을 나눌 때 실부부는 실수부끼리, 허수부는 허수부끼리 나눈다. 즉 다음 두 명령은 같은 것이다.

>> linspace(1+%i, 2+3*%i, 5)
>> linspace(1, 2, 5) + linspace(1, 3, 5)*%i


후자 보다는 전자가 더 간단하므로 이것을 사용하면 된다

.

 함수 rand()는 난수행렬을 생성시킨다. 이때 균일분포/정규분포를 strKey로 지정할 수 있다.


위 예제에서 histplot()은 히스토그램을 그리는 함수이다.



Posted by 살레시오
,