+ All Categories
Home > Documents > math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap01.pdf · 예제 2.1 (저장된...

math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap01.pdf · 예제 2.1 (저장된...

Date post: 30-Aug-2019
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
34
Transcript

1.1 행렬 만들기 1

1. 배열과 행렬

연산은 여러 수학의 기본이 된다. 가장 기본적인 연산은 하나의 값만을 가지는

스칼라(Scalar)를 대상으로 하고, 연산의 결과 값은 스칼라들의 결합으로 표현된다. 예

를 들어 자연수에 대한 곱셈 연산의 경우, 두 자연수 3과 5를 결합한 곱셈 연산의 결과

값은 3*5로 간단히 표현된다. 그러나 많은 경우 하나 이상의 수에 대해서 같은 연산이

동시에 행해 질 수 있다. 예를 들어, 1월부터 12월까지 수입을 표시하는 12개의 수(a1,

... , a12)와 지출을 표시하는 12개의 수(b1, ... , b12)가 있다고 하자. 월별 수지동향(ci) =

수입(ai) - 지출(bi)과 같은 연산을 12번 반복하는 대신, 이들 12개씩의 수를 가진 배열

a, b, c를 이용할 수도 있다. 그러면, 위 계산을 c=a-b와 같이 간단히 표현 할 수 있을

것이다. 행렬(matrix)은 이러한 개념을 확장한 것으로, m, n≥1에 대하여, m개의 행과

n개의 열 속에 m*n개의 수를 다음과 같이 배열한 것이다.

A=

a 11, a 12, a 13, ⋯, a 1n

a 21, a 22, a 23, ⋯, a 2n

⋯, ⋯, ⋯, ⋱, a 1n

a m1, a m2, a m3, ⋯, a mn

혹은 (a i j ), i= 1,⋯,m, j=1,⋯,n

MATLAB은 순수 과학과 공학적 수치계산 및 시각화를 위하여, 행렬에 기초

한 시스템이다. MATLAB에서는 Fortran이나 C 같은 프로그래밍 언어에서 요구한 시

간의 몇 분의 일만으로도 복잡한 수치적 문제를 해결할 수 있다. MATLAB이라는 이

름은 MATrix LABoratory에서 가져온 것이다. 이 이름에서 알 수 있듯이 MATLAB의

가장 기본이 되는 대상은 (복소수를 원소로 가지는) 행렬이다. 지금부터 MATLAB을

이용하여 행렬을 표시하고, 이용하는 방법에 대하여 살펴보자.

1.1 행렬 만들기

행렬 중 하나의 행과 여러 개의 열을 가지는 경우를 행벡터(row vector)라고

말하고, 하나의 열에 여러 개의 행을 가지는 경우를 열벡터(column vector)라고 말한

다. 실수는 1행 1열을 가진 행렬임으로, 행벡터이자 열벡터라고 할 수 있다. MATLAB

에서는 행벡터(row vector)를 표현하고자 할 경우는 대괄호([ ]) 안에 원소들 사이에

쉼표(comma)나 빈칸(space)을 사용하면 된다. MATLAB에서는 일정한 값만큼 증감하

는 등차수열을 원소로 하는 배열은 대괄호 없이 초기값:증감값:끝값 형태로 표시할 수

2 1. 배열과 행렬

도 있다. 이때 증감값이 1인 경우는 초기값:끝값의 형태로 간단히 쓸 수도 있다.

예제 1.1 (행벡터 만들기)>> a=[1 2 3 4 5] % a는 1에서 5까지a = 1 2 3 4 5>> b=1:2:9 % b는 1에서 2씩 증가시켜 9까지b = 1 3 5 7 9

>> c=[b a]c = 1 3 5 7 9 1 2 3 4 5

>> d=[1 0 1 b(3) a(1:2:5)]d = 1 0 1 5 1 3 5

빈칸은 배열 혹은 행벡터의 원소를 구분하는데 이용되므로, 복소수를 표시하기

위한 i 혹은 j를 쓸 때에는 빈칸을 없애거나 괄호(parentheses)를 이용하여야 하다.

예제 1.2 (복소수 사용하기)>> [1 -2i 3 4 5+6i] % contains 5 elementsans = 1.0000 0 - 2.0000i 3.0000 4.0000 5.0000 + 6.0000i >> [(1 -2i) 3 4 5+6i] % contains 4 elementsans = 1.0000 - 2.0000i 3.0000 4.0000 5.0000 + 6.0000i

>> [1-2i 3 4 5+6i] % contains 4 elementsans = 1.0000 - 2.0000i 3.0000 4.0000 5.0000 + 6.0000i

한편, 열벡터(column vector)로 나타내려면 대괄호(bracket) 안의 값들 사이에

세미콜론(semicolon)을 사용하면 된다. 이때, Return이나 Enter key를 입력하면 세미콜

론과 마찬가지로 새로운 행을 입력할 수 있다.

예제 1.3 (열벡터 만들기)>> c=[1;2;3;4;5]c = 1 2

1.1 행렬 만들기 3

3 4 5

행렬 A=

a 11, a 12, a 13, ⋯, a 1n

a 21, a 22, a 23, ⋯, a 2n

⋯, ⋯, ⋯, ⋯, ⋮a m1, a m2, a m3, ⋯, a mn

은 A 1=

a 11

a 21

⋯a m1

에서부터 A n=

a 1n

a 2n

⋯a mn

까지 n개의 열벡터 혹은 ⋯ 에서부터 ⋯ 까지

m개의 행벡터로 구성되어 있다고 생각할 수 있다. 또한 이차원 배열(array)이라고도

불리는 행렬은 이러한 행벡터와 열벡터뿐만 아니라 이미 만들어진 다른 행렬들을 조합

하여 만들 수 있는데, 각각의 행 안의 원소들은 빈칸( ) 혹은 쉼표(,)로 구별하고, 각

행의 구별은 세미콜론(;)이나 줄 바꿈(Return, Enter)으로 한다.

예제 1.4 (행렬만들기)>> g=[1 2 3 4; 5 6 7 8] % g는 2 by 4 matrixg = 1 2 3 4 5 6 7 8

>> g=[g, g; 9:12, 9:12] % g는 6행 4열로 확장됨g = 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 9 10 11 12 9 10 11 12

>> h=[1 2 3; 4 5 6 7] % 모든 row가 같은 수의 column을 가져야만 한다.??? All rows in the bracketed expression must have the same number of column

x의 값들을 넣는 방법으로는 x의 원소의 개수가 적을 경우 직접 타이핑하지

만, 수가 너무 많을 경우 colon 기호와 linspace라는 MATLAB 함수를 이용할 수 있다.

이러한 경우는 샘플링이라는 작업을 통해 흔히 발생한다. y=sin(x), 0≤x≤π를 계산하

는 문제가 있다고 하자. 이 범위내의 모든 점에서 계산하는 것은 불가능하므로(왜냐하

면 무한개의 점이 있으니까) 유한개의 점들(finite number of points)을 선택해야 한다.

이러한 과정을 함수를 샘플링(sampling)한다고 말한다. 여기서는 이 범위내의 0.1π마

다, 즉, x=0,0.1π,0.2π,…,1.0π 계산해보도록 한다. 이 경우, 배열(array)을 이용하여 x

와 그에 대한 y 값을 순서대로 나타낼 수 있다.

4 1. 배열과 행렬

x 0 0.1π 0.2π 0.3π 0.4π 0.5π 0.6π 0.7π 0.8π 0.9π π

y 0 0.31 0.59 0.81 0.95 1.0 0.95 0.81 0.59 0.31 0

위와 같은 배열을 MATLAB에서 만드는 법은 아래 예제와 같다. 아래 예제에서처럼 x

가 11개의 원소를 가진 경우, MATLAB은 역시 11개의 열을 가진 배열로 결과를 되돌

려 준다. 이 때, x는 1행 11열 행렬 또는 길이가 11인 행벡터로 불린다.

예제 1.5 (Sampling)>> x=[0 .1*pi .2*pi .3*pi .4*pi .5*pi .6*pi .7*pi .8*pi .9*pi pi]x = Column 1 through 7 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 Column 8 through 11 2.1991 2.5133 2.8274 3.1416

>> y=sin(x) y = Column 1 through 7 0 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 Column 8 through 11 0.8090 0.5878 0.3090 0.0000

>> plot(x,y) % y = sin(x)의 그래프

이러한 작업은 (:)을 이용하여 등차수열을 원소로 가지는 배열을 만들거나 초

기 값과 말기 값을 일정한 개수로 나누어주는 linspace라는 MATLAB 함수를 이용하

면 보다 용이하게 할 수 있다. 이와 비슷한 기능을 가진 logspace는 로그적으로 나뉘어

진 배열(logarithmically spaced array)을 만들어 준다. linspace와 logspace의 기본 형태

linspace(first_value, last_value, number_of_values).

logspace(first_exponent, last_exponent, number_of_values)

이고 보다 자세한 설명은

help linspace, help logspace

를 참고하면 된다.

예제 1.6 (linspace 혹은 logspace 이용하기)>> x=(0:0.1:1)*pi % 0에서 0.1*pi씩 증가하여 1*pi까지 11개의 원소x = Column 1 through 7 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850

1.2 행렬의 크기와 특수 행렬들 5

Column 8 through 11 2.1991 2.5133 2.8274 3.1416

>> x=linspace(0,pi,11) % 0에서 pi까지 11개의 원소를 표현x = Column 1 through 7 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 Column 8 through 11 2.1991 2.5133 2.8274 3.1416

>> logspace(0,2,11) % 10^0부터 10^2까지 11개의 점이 포함되도록 만듬ans = Column 1 through 7 1.0000 1.5849 2.5119 3.9811 6.3096 10.0000 15.8489 Column 8 through 11 25.1189 39.8107 63.0957 100.0000

지금까지의 배열 만드는 방법을 요약하면 아래 표와 같다.

간단한 배열 만들기

x=[2 2*pi sqrt(2) 2-3j] 4개의 원소를 가진 행벡터 (2-3j 사이 빈칸 주의)

x=first:last first부터 last까지 1씩 증가하는 수들을

원소로 가지는 행벡터

x=first:increment:last first부터 last까지 increment씩 증가하는 수들을

원소로 가지는 행벡터

x=linspace(first,last,n) first부터 last까지 균일한 간격으로 증가하는

n개의 수들을 원소로 가지는 행벡터

x=logspace(first,last,n) 10^first부터 10^last까지 지수적으로 균일한 간격의

n개의 수들을 원소로 가지는 행벡터

1.2 행렬의 크기와 특수 행렬들

MATLAB을 사용하다 보면 이제까지 만들어진 행렬의 이름과 크기를 알 필요

가 생긴다. who라는 명령어는 사용자가 만들어낸 모든 변수들의 이름을 나타내준다.

whos라는 명령어를 사용하면, 저장된 행렬변수에 대한 보다 자세한 정보를 얻을 수 있

다. 개개의 변수의 크기는 size 함수를 이용할 수 있고, length 함수는 행의 개수와 열

의 개수 중 큰 값을 보여 준다.

6 1. 배열과 행렬

예제 2.1 (저장된 변수명과 변수의 크기와 길이)>> whos

Name Size Elements Bytes Density Complexa 1 by 5 5 40 Full Nob 5 by 1 5 40 Full Noc 1 by 5 5 40 Full Nod 1 by 5 5 80 Full Yese 5 by 1 5 80 Full Yesf 5 by 1 5 80 Full Yesg 3 by 4 12 96 Full No

Grand total is 42 elements using 456 bytes leaving 2316084 bytes of memory free.

>> A=[1 2 3 4; 5 6 7 8]A = 1 2 3 4 5 6 7 8

>> s=size(A) % size 함수는 행의 개수와 열의 개수를 알려 줌s = 2 4

>> [r,c]=size(A)r = 2c = 4

>> r=size(A,1), c=size(A,2) % 두 개이상의 명령어를 쓰려면 , 혹은 ;를 사용r = 2c = 4

>> length(A) % length 함수는 행의 개수와 열의 개수 중 더 큰 값을 준다ans = 4

>> size([])ans = 0 0

이상의 개념들을 아래와 같이 요약해 볼 수 있다.

1.2 행렬의 크기와 특수 행렬들 7

변수들의 크기를 알려주는 MATLAB 명령어들

whos 현재 작업공간에 기억된 변수들의 이름과 크기 출력하여 줌

s=size(A) 행렬 A의 행의 크기와 열의 크기를 s(1)과 s(2)에 저장하여 줌

[r,c]=size(A) 행렬 A의 행의 크기와 열의 크기를 r과 c에 저장하여 줌

r=size(A,1) 행렬 A의 행의 크기를 r에 저장하여 줌

c=size(A,2) 행렬 A의 열의 크기를 c에 저장하여 줌

n=length(A) 행렬 A의 행의 크기와 열의 크기중 큰 값을 되돌려 줌

MATLAB에서는 자주 사용되는 행렬을 그 크기만으로 쉽게 만들 수 있는 방

법을 제시하고 있다. 모든 원소가 0인 영행렬, 모든 원소가 1인 일행렬, 대각선 원소는

1이고 나머지는 0인 단위행렬, 모든 원소가 0과 1 사이의 균일하게 분포된(uniformly

distributed) 임의의 수들(random numbers)인 랜덤행렬 등이 그 예이다. 이외에도, 공

행렬(empty matrix)같은 많은 특수한 행렬을 제공한다. 공행렬은 연산의 결과가 없을

경우에 사용 된다.

예제 2.2 (특수행렬 만들기)>> zeros(2) % a 2-by-2 matrix of zerosans = 0 0 0 0

>> ones(2,4)*pi % a 2-by-4 matrix of ones * pians = 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416

>> A=[1 2 3; 4 5 6]; % 명령문 마지막에 ;를 사용하면 결과가 출력 안됨>> ones(size(A))ans = 1 1 1 1 1 1

>> eye(3)ans = 1 0 0 0 1 0 0 0 1>> eye(3,2)ans = 1 0 0 1 0 0

8 1. 배열과 행렬

>> rand(3,1) % 0과 1 사이의 균일하게 분포된 임의의 수들의 3 by 1 행렬ans = 0.2190 0.0470 0.6789

>> randn(2) % 평균(mean)이 0이고 표준편차(variance)가 1인 % 정규 분포를 가진 수들의 2 by 2 행렬ans = 1.1650 0.0751 0.6268 0.3516

>> a=[1 2 3;4 5 6];>> b=find(a>10)b = [ ]

아래 표로 특수한 행렬들을 요약해보았다.

특수 행렬을 만드는 명령어

[] 공행렬

compan 동반 행렬; compan([1 2 3 4])=[-2 -3 -4; 1 0 0; 0 1 0]

eye 단위행렬

gallery 각종 행렬 문제 조사를 위한 행렬

hadamard Hadamard 행렬; H의 원소가 1 또는 -1이고 H'*H=n*eyn(n)

hilb Hilbert 행렬; A(i,j) = 1/(i+j-1)

invhilb Hilbert 행렬의 역행렬

magic 각 행과 각 열 그리고 대각선 원소의 합이 일정한 마방진

ones 모든 원소값이 1인 행렬

pascal Pascal 삼각행렬

rand 모든 원소가 [0,1] 사이에 균일하게 분포하는 행렬

randn 모든 원소가 평균=0, 분산=1의 정규분포를 가지는 행렬

rosser 고유치 문제 평가를 위한 8*8 행렬

toeplitz Toplitz 행렬; toeplitz([1 2 3])=[1 2 3; 2 1 2; 3 2 1]

vander Vandermonde 행렬; vander([1 2 3])=[1 1 1; 4 2 1; 9 3 1]

wilkinson Wilkinson 행렬; 고유치 문제 평가를 위한 행렬

zeros 모든 원소값이 0인 영행렬

1.3 행렬의 방향과 전치행렬 9

1.3 행렬의 방향과 전치행렬

[처음값:증감값:끝값]처럼 콜론(colon)을 사용하거나 linspace나 logspace같은

함수를 사용하면 행벡터를 쉽게 만들 수 있다. 이러한 행벡터를 열벡터를 바꾸려면

MATLAB transpose operator(')를 이용하면 된다.

예제 3.1 (열벡터 만들기)>> a=1:5a = 1 2 3 4 5

>> b=a'b = 1 2 3 4 5

>> c=b' c = 1 2 3 4 5

A=(a ij)를 n-by-m 행렬이라 할 때, 이를 m-by-n 행렬로 변환시켜 주는 연

산자로는 복소 전치행렬 연산자와 (실수) 전치행렬 연산자 두 종류가 있다. 그 연산

결과인 m-by-n 행렬은 각각 AH:=( a ji ), AT=(a ji )라고 표현하고 각각은 A의

Hermitian, A의 Transpose이라고 부른다. 주어진 행렬이 복소수원소를 가지고 있을 때

에도 경우에 따라서는 연산자와 결과 행렬을 전치행렬연산자, A의 Transpose라고도

부른다. MATLAB에서 transpose operator(')는 배열(array)이 복소수(complex)일 경우

conjugate을 준다. 즉, 복소수 부분(imaginary part)의 부호가 바뀌면서 transpose가 된

다. 그러나, dot-transpose operator(.')의 경우는 conjugate 없이 transpose만 된다.

예제 3.2 (전치행렬만들기)>> c=a.' % 실수 데이터에서는 ‘와 .’는 서로 동일하다.c = 1 2 3 4 5

10 1. 배열과 행렬

>> d=a+i*a % 여기서 i=sqrt(-1)d = Columns 1 through 4 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 +4.0000i Columns 5 5.0000 + 5.0000i

>> e=d' % complex conjugate transpose of de = 1.0000 - 1.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i 4.0000 - 4.0000i 5.0000 - 5.0000i

>> f=d.' % noncomplex conjugate transpose of df = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i

행렬 중 행의 수와 열의 수가 n으로 같은 n-by-n 행렬을 n차 정방행렬

(square matrix)라 부른다. 복소정방행렬 중 복소전치행렬과 자기 자신이 같은 행렬을

에르미트(Hermitian)행렬이라 하고, 특히 행렬이 실수행렬인 경우는 대칭(Symmetric)행

렬이라고도 한다. 또한, 전치행렬과 자신이 부호만 다를 때를 각각 반에르미트

(Skew-Hermitian), 반대칭(Skew-Symmetric) 행렬(혹은 교대행렬)이라 한다. 임의의

행렬 A는 에르미트 행렬과 반에르미트 행렬 혹은 대칭행렬과 반대칭 행렬의 합으로

표현가능하다.

예제 3.3 (대칭행렬과 반대칭행렬)>> a = rand(3), S = (a+a')/2 , K = (a-a')/2, sum = S+Ka = 0.7564 0.2470 0.7534 0.9910 0.9826 0.6515 0.3653 0.7227 0.0727S = 0.7564 0.6190 0.5593 0.6190 0.9826 0.6871 0.5593 0.6871 0.0727K = 0 -0.3720 0.1940 0.3720 0 -0.0356

1.4 상수와 배열, 배열과 배열의 연산 11

-0.1940 0.0356 0sum = 0.7564 0.2470 0.7534 0.9910 0.9826 0.6515 0.3653 0.7227 0.0727

1.4 상수와 배열, 배열과 배열의 연산

행렬의 덧셈(addition)과 뺄셈(subtraction)은 두 행렬의 크기가 같은 경우에만

가능하다. m*n 행렬 A=(aij)와 m*n 행렬 B=(bij)에 대하여, (aij + bij) [혹은 (aij - bij)]

를 i-행 j-열 원소로 가지는 행렬을 A와 B의 합 A+B [혹은 차 A-B] 이라 한다. 만약

행렬 A=(a11=a) 혹은 행렬 B=(b11=b)가 상수 즉 1*1 행렬이면 합 A+B [혹은 차 A-B]

는 상수를 각각의 행렬의 원소에 더한 [혹은 뺀] 것으로 생각한다. 즉, A+B=(a+bij),

(aij+b) [혹은 A-B=(a-bij), (aij-b)]와 같이 정의한다. 마찬가지로 상수 c와 행렬 A=(aij)

의 곱셈과 나눗셈은 행렬의 각각에 원소에 대해 곱하거나 나눈 것으로 한다. 즉, 상수

곱셈 c*A = A*c = (c*aij)와 상수 나눗셈 A/c=(aij/c)로 정의한다.

예제 4.1 (뎃셈과 상수연산) >> g, h % recall previous arrayg = 1 2 3 4 5 6 7 8 9 10 11 12h = 1 1 1 1 2 2 2 2 3 3 3 3

>> g+ones(3,3)??? Error using ==> +Matrix dimensions must agree.

>> g+h % add h to g on an element-by-element basisans = 2 3 4 5 7 8 9 10 12 13 14 15

>> ans-h % subtract h from the previous answer to get g backans = 1 2 3 4

12 1. 배열과 행렬

5 6 7 8 9 10 11 12

>> g-2 % g의 모든 원소에서 2를 뺀 경우ans = -1 0 1 2 3 4 5 6 7 8 9 10

>> 2*g-1ans = 1 3 5 7 9 11 13 15 17 19 21 23

>> 2*g-h % multiplies g by 2 and subtracts h from the resultans = 1 3 5 7 8 10 12 14 15 17 19 21

상수와의 곱셈과 나눗셈을 일반화하여 같은 크기의 두 행렬 A=(aij)와 m*n 행

렬 B=(bij)에 대하여, 행렬의 각각의 위치에 있는 원소끼리의 곱셈이나 나눗셈을 하고

자 할 경우는 .*(dot multiplication symbol)이나 ./(dot division symbol)을 사용한다.

즉, A.*B=(aij*bij)이고, A./B=(aij/bij)이다. 역수를 곱하는 연산 .\는 B.\A = (bij-1*aij =

aij/bij)와 같이 정의되어, 원소끼리의 연산에서는 A./B=(aij/bij)와 구별이 없다. 그러나 행

렬연산에서는 교환법칙이 성립하지 않아, 이 두 연산은 서로 다른 결과를 가진다. 행렬

의 곱셈과 나눗셈에 대해서는 다음 절에서 보다 자세히 공부할 것이다.

예제 4.2 (원소끼리의 곱셈과 나눗셈)>> g.*h ans = 1 2 3 4 10 12 14 16 27 30 33 36

>> g./hans = 1.0000 2.0000 3.0000 4.0000 2.5000 3.0000 3.5000 4.0000 3.0000 3.3333 3.6667 4.0000

>> h.\g % 슬래쉬(slash)나 백슬래쉬(back slash) 모두 나눗셈을 정의할 때, % 슬래쉬 아래쪽이 슬래쉬 위쪽을 나눈다.

1.4 상수와 배열, 배열과 배열의 연산 13

ans = 1.0000 2.0000 3.0000 4.0000 2.5000 3.0000 3.5000 4.0000 3.0000 3.3333 3.6667 4.0000

>> g*h % 행렬의 곱셈은 매우 특별한 방식으로 정의 되어 있다.??? Error using ==> *Inner matrix dimensions must agree.

>> g/hWarning: Rank deficient, rank = 1 tol = 5.3291e-15ans = 0 0 0.8333 0 0 2.1667 0 0 3.5000

>> h\g % 행렬의 두 나눗셈이 서로 다른 결과를 가지고 있다.Warning: Rank deficient, rank = 1 tol = 3.3233e-15ans = 2.7143 3.1429 3.5714 4.0000 0 0 0 0 0 0 0 0 0 0 0 0

배열의 지수승을 할 경우는 ^을 사용하는데, 이 경우는 행렬 자체를 지수승 하

는 것이고 .^을 이용하면 각각의 원소에 지수승을 한 것이 된다.

예제 4.3 (원소끼리의 지수승)>> g,hg = 1 2 3 4 5 6 7 8 9 10 11 12 h = 1 1 1 1 2 2 2 2 3 3 3 3

>> g.^2ans = 1 4 9 16 25 36 49 64 81 100 121 144>> g.^-1 % MATLAB doesn't like this syntax

14 1. 배열과 행렬

??? g.^- |Missing variable or function

>> g.^(-1) % However, with parentheses it works!ans = 1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 0.0909 0.0833

>> 2.^gans = 2 4 8 16 32 64 128 256 512 1024 2048 4096

>> g.^hans = 1 2 3 4 25 36 49 64 729 1000 1331 1728

>> g.^(h-1)ans = 1 1 1 1 5 6 7 8 81 100 121 144

지금까지의 내용을 아래 표로 요약해보았다.

원소끼리의 배열 연산

스칼라 수와의 합 a+c = [a1+c a2+c ... an+c]

스칼라 수와의 곱 a*c = [a1*c a2*c ... an*c]

배열의 합 a+b = [a1+b1 a2+b2 ... an+bn]

배열 원소끼리의 곱 a.*b = [a1*b1 a2*b2 ... an*bn]

배열의 오른쪽 나눗셈 a./b = [a1/b1 a2/b2 ... an/bn]

배열의 왼쪽 나눗셈 a.\b = [a1\b1 a2\b2 ... an\bn]

배열의 지수승 a.^c = [a1^c a2^c ... an^c]

c.^a = [c^a1 c^a2 ... c^an]

a.^b = [a1^b1 a2^b2 ... an^bn]

1.5 행렬의 곱셈과 나눗셈 15

1.5 행렬의 곱셈과 나눗셈

m-by-p 행렬 A=(aij; i=1,…,m; j=1,…p)와 p-by-n 행렬 B=(bij; i=1,…,p; j=1,…

n)에 대하여, 행렬의 곱 A*B를 정의하자. 즉, A의 열의 크기와 B의 행의 크기가 p로

같은 두 행렬

A=

a 11, a 12, ⋯, a 1p

a 21, a 22, ⋯, a 2p

⋯, ⋯, ⋯, ⋮a m1, a m2, ⋯, a mp

, B=

b11, b12, b13, ⋯, b1n

b21, b22, b23, ⋯, b2n

⋯, ⋯, ⋯, ⋯, ⋮bp1, bp2, bp3, ⋯, bpn

에 대하여 A*B의 i-행 j-열 원소는

(A*B) ij= ∑p

k= 1a ikbkj=a i1b1j+a i2b2j+⋯+a ipbpj

로 정의한다. 행렬 A를 구성하고 있는 m개의 행벡터를 차례로

A 1=[ ]a 11, a 12, ⋯, a 1p ,…, Am =[ ]a m1, a m2, ⋯, a mp 라하고, B를 n개의 열벡

터 B 1=

b11

b21

⋯bp1

,…, B n=

a 1n

a 2n

⋯a pn

의 조합이라 하면, AB의 i-행 j-열 원소는 두 개의 p차

벡터 A i와 B j의 내적으로 표시할 수 있다.

A*B=

A 1⋅B 1, A 1⋅B 2, A 1⋅B 3, ⋯, A 1⋅B n

A 2⋅B 1, A 2⋅B 2, A 2⋅B 3, ⋯, A 2⋅B n

⋯, ⋯, ⋯ ⋯, ⋮Am⋅B 1, Am⋅B 2, Am⋅B 3, ⋯, Am⋅B n

이와 같이 행렬의 곱은 내적의 일반화로 생각할 수 있으므로, MATLAB에서는 벡터의

내적에 해당하는 연산자가 따로 없고 행렬의 곱을 이용한다. 이때, 내적연산자의 앞의

인수는 행벡터이고 뒤의 인수는 같은 길이의 열벡터인 것에 유의하여야 한다.

예제 5.1 (행렬의 곱와 내적을 이용한 사이각 구하기)>> A=[2 1 5; 1 3 2], B=[3 4; -1 2; 2 1]A = 2 1 5 1 3 2B = 3 4 -1 2 2 1>> A*Bans =

16 1. 배열과 행렬

15 15 4 12

>> x = 1:4, y=2:2:8x = 1 2 3 4y = 2 4 6 8>> x * y??? Error using ==> *Inner matrix dimensions must agree.>> x * y'ans = 60

>> a=[-1 2 4]; b=[1.5 2 -1]; % angle between vectors a and b>> theta = acos( a*b' / sqrt(a*a'*b*b') )

행렬의 곱은 앞 인자의 열의 수와 뒷 인자의 행의 수가 일치할 경우에만 정의

할 수 있다. 즉, 3*2 행렬 A와 2*2 행렬 B의 경우 A*B는 3*2 행렬이지만 B*A는 정의

되지 않는다. 또한, 두 행렬 모두 차수가 같은 정방행렬이라도, 행렬의 곱연산은 교환법

칙이 성립하지 않는다. 즉,

AB≠BA

그러나 AB와 BC의 행렬 곱셈연산이 각각 정의되는 경우에 대하여는 (AB)와 C의 곱

과 A와 (BC)의 곱의 연산을 계산할 수 있고, 그 결과는

(AB)C=A(BC)=ABC

와 같다. 이를 행렬 곱셈에 대한 결합법칙이라 한다. 또한, AB와 AC가 각각 정의되는

경우, 행렬의 곱과 합에 대한 아래와 같은 배분법칙이 성립한다.

A(B+C)=AB+AC

5.2 (행렬 곱연산의 교환법칙)>> C=[1 3; -1 -1]C = 1 3 -1 -1>> C*ones(2,2) % 행렬의 곱셈에 대한 교환법칙은 성립하지 않는다.ans = 4 4 -2 -2>> ones(2,2)*Cans = 0 2

1.5 행렬의 곱셈과 나눗셈 17

0 2

>> AB=A*B, AB*C % 행렬의 곱셈에 대한 결합법칙은 성립한다.AB = 15 15 4 12ans = 0 30 -8 0>> BC=B*C, A*BCBC = -1 5 -3 -5 1 5ans = 0 30 -8 0

행렬의 곱셈은 교환법칙이 성립하지 않으므로 나눗셈을 정의하는데 수의 경우

보다 더 큰 주의가 요구된다. 곱셈이 정의되는 행렬 A와 B에 대해 A*B=C라 하면, 나

눗셈은 A=C/B 혹은 B=A\C에서와 같이 (우측)나눗셈과 (좌측)나눗셈의 두 가지로 정

의할 수 있다. 그러나 이러한 일반적 정의는 보다 확장된 수학개념을 필요로 하므로 다

음 장에서 보다 자세히 설명하기로 하고, 여기에서는 특이하지 않는(non-singular) 정

방행렬 A와 B에 대해서만 살펴보기로 하자. 만약 AX=XA가 단위행렬일 때 X를 A

의 곱셈에 대한 역원이라 하고 A-1이라고 표시한다. 곱셈에 대한 역원을 곱하는 것을

나눗셈이라 하고, 정방행렬의 경우에는 다음의 두 가지 경우가 있다.

A*B=C → {A = A*B*B-1 = C/BB = A-1*A*B = A\C

예제 5.3 (행렬의 나눗셈)>> A=[2 1 5; 1 3 2], B=[3 4; -1 2; 2 1] % 정방행렬이 아닌 경우의 나눗셈A = 2 1 5 1 3 2B = 3 4 -1 2 2 1>> (A*B)/Bans = 4.5000 -1.5000 0 2.0000 2.0000 0>> A\(A*B)ans =

18 1. 배열과 행렬

0 0 -0.7692 2.3077 3.1538 2.5385

>> A=rand(3,3), B=rand(3,3) % 일반적 정방행렬의 나눗셈A = 0.2190 0.6793 0.5194 0.0470 0.9347 0.8310 0.6789 0.3835 0.0346B = 0.0535 0.0077 0.4175 0.5297 0.3834 0.6868 0.6711 0.0668 0.5890>> (A*B)/Bans = 0.2190 0.6793 0.5194 0.0470 0.9347 0.8310 0.6789 0.3835 0.0346>> A\(A*B)ans = 0.0535 0.0077 0.4175 0.5297 0.3834 0.6868 0.6711 0.0668 0.5890

1.6 배열의 주소할당

MATLAB에서 배열 안의 각각의 원소들은 괄호 속 번호를 사용하여 원소의

위치를 나타낼 수 있다. 즉 x(1)는 배열 안의 첫 번째 원소를 나타낸다. 또한 한 번에

원소의 블록을 설정해 주기 위해 MATLAB에서는 colon(:)표시를 사용한다.

예제 6.1 (1차원 배열의 주소할당)>> x=(0:0.1:1)*pi; % 0에서 0.1*pi씩 증가하여 1*pi까지 11개의 원소>> y=sin(x);>> x(3) % The third element of xans = 0.6283>> y(5) % The fifth element of yans = 0.9511

>> x(1:5) % 첫 번째에서 다섯 번째 원소까지 나타냄ans =

1.6 배열의 주소할당 19

0 0.3142 0.6283 0.9425 1.2566>> y(3:-1:1)ans = 0.5878 0.3090 0>> x(2:2:7) % 두 번째, 네 번째, 여섯 번째 원소. % 즉, 두 번째 원소부터 7보다 작은 원소까지 2씩 증가시킴.ans = 0.3142 0.9425 1.5708

>> y([8 2 9 1]) % [8 2 9 1] 자체가 y의 원소들의 주소의 배열이다ans = 0.8090 0.3090 0.5878 0

앞에서는 1차원 배열 즉 벡터들의 주소할당에 대해서 살펴보았으나, 여기서는

2차원 배열 즉 행렬의 취급 및 표현에 대해 알아보자. MATLAB 행렬은 행의 위치와

열의 위치를 나타내는 두 개의 인덱스(Index)로 행렬의 원소(들)을 표현할 수 있다.

예제 6.2 (2차원 배열의 주소할당)>> A=[1 2 3; 4 5 6; 7 8 9]A = 1 2 3 4 5 6 7 8 9

>> A(2,3)=0 % A(2,3)의 원소 [2nd row, 3rd column]가 0으로 바뀜 A = 1 2 3 4 5 0 7 8 9

>> A(2,6)=1 % 원래 A가 6개의 열을 가지지 않음으로 0을 채워서 늘려놓았다. A = 1 2 3 0 0 0 4 5 0 0 0 1 7 8 9 0 0 0 >> A=[1 2 3; 4 5 6; 7 8 9]; % restore original data >> B=A(3:-1:1,1:3) % row의 순서를 거꾸로 쓰는 법 B = 7 8 9 4 5 6 1 2 3 >> B=A(3:-1:1,:) % 마지막의 싱글 콜론(single colon)은 모든 열을 가지는 % 것을 의미한다. 즉, :은 1:3을 짧게 줄여 쓴 것이다.

20 1. 배열과 행렬

B = 7 8 9 4 5 6 1 2 3 >> C=[A B(:,[1 3])]C = 1 2 3 7 9 4 5 6 4 6 7 8 9 1 3

>> B=A(1:2,2:3)B = 2 3 5 6

>> C=[1 3] C = 1 3

>> B=A(C,C) % 여기서는 배열C가 A의 인덱스(index)로 사용되어 진다.B = 1 3 7 9

MATLAB에서는 행렬의 크기와 모양을 바꾸는 여러 방법을 가지고 있다.

m-by-n 행렬을 n-by-m 행렬로 바꾸는 전치행렬연산자 뿐만 아니라, 행렬의 주소할당

방법을 적절히 활용하면 다양한 방법으로 행렬의 크기와 모양을 변화시킬 수 있다. 이

때, 모든 행이나 모든 열을 표시하기 위해서는 콜론(:)이 사용되고, 공행렬 [ ]는 원소가

없는 행렬을 표시하는데 사용된다. 또한, 행렬을 1차원 배열로 표현하거나 1차원으로

만들어진 기억공간에 저장하면, A(1,1), A(2,1), …, A(m,1), A(2,1), A(2,2), …, A(m,2),

…, A(1,n), …, A(m,n)와 같이 행의 주소가 먼저 모두 변하고 난 후에 열의 주소가 변

한다. 이러한 저장 방식을 열 우선(Column Major or Column Oriented Addressing) 방

식이라고 하여 Fortran과 MATLAB에서 이 방식을 이용한다. Sum이나 Prod와 같이

주어진 벡터의 합을 구하는 함수의 경우, 행렬이 주어지면 행벡터끼리 합하거나 곱한

결과 출력 값을 열벡터로 준다. 전체 원소의 합이나 곱을 구하려면 같은 연산을 두 번

반복하면 된다.

예제 6.3 (2차원 배열의 조작)>> A = [1 2 3; 4 5 6; 7 8 9]>> sum(A) % 합을 구하는 함수들은 열 단위로 연산한다.ans =

1.6 배열의 주소할당 21

12 15 18>> sum(sum(A))ans = 45

>> A(1:9) % A를 행벡터로 바꿈A = 1 4 7 2 5 8 3 6 9

>> B=A(:) % A의 열들을 하나의 열로 펼쳐 놓음B = 1 4 7 2 5 8 3 6 9

>> B=B.' % dot-transpose operation을 이용하여 row로 바꿈B = 1 4 7 2 5 8 3 6 9

>> B=[1 2 3; 4 5 6; 7 8 9];>> B(:,2)=[] % [](empty matrix)는 앞의 B의 모든 행의 두 번째 열을 % 삭제하라는 의미이다B = 1 3 4 6 7 9

>> B=B.'B = 1 4 7 3 6 9

>> B(2,:)=[]B = 1 4 7

>> A(2,:)=B % 두 번째 열의 모든 행 원소를 B로 대체A = 1 2 3 1 4 7 7 8 9

22 1. 배열과 행렬

>> B=A(:, [2 2 2 2]) % 모든 행을 두 번째 열에 의해 네 번 반복. % 이런 것을 Tony's Trick이라고 함B = 2 2 2 2 4 4 4 4 8 8 8 8

이처럼 배열에 주소를 주는 기술(array-addressing technique)은 아래의 표로

요약된다.

배열의 주소 지정

A(r,c) 행과 열 색인 벡터 r과 c에 의하여 정의된 A 내에서 부배열

A(r,:) 행 색인 벡터 r과 모든 열에 의하여 정의된 A 내에서 부배열

A(:,c) 열 색인 벡터 c와 모든 행에 의하여 정의된 A 내에서 부배열

A(:) 열 우선 순서에 의해 나열된 열벡터로서의 A의 모든 원소의 배열

A(i) 단일 색인 벡터 i에 의하여 정의된 A 내에서 부배열

A(x) 논리 배열 x에 의하여 정의된 A 내에서 부배열

(단, x의 크기는 A와 같아야 함.)

이러한 행렬의 조작에서는 행렬의 크기에 대해 유의하여야 한다. 좌측 대입 변

수의 크기가 정해진 경우, 대입하려고 하는 행렬의 크기와 일치하여야 한다. 만약 크기

는 일치하지만 좌측대입변수의 크기를 증가 시켜야하는 경우, MATLAB은 자동적으로

0으로 빈 공간을 채운다.

예제 6.4 (배열 조작시 행렬의 크기)>> A=[1 2 3; 4 5 6; 7 8 9];>> A(2,2)=[]??? In an assignment A(matrix,matrix) = B, the number of rows in B and the number of elements in the A row index matrix must be the same.

>> B B = 1 4 7

>> B=A(4,:) % A가 네 번째 row를 가지고 있지 않기 때문에 % MATLAB은 어떻게 하라는 건지 알지 못한다.??? Index exceeds matrix dimensions

>> B(1:2,:)=A % 두 행렬의 크기(size)가 다른 경우 error가 생긴다??? In an assignment A(matrix,:) = B, the number of columns in A and B must be the same.

1.6 배열의 주소할당 23

>> B(3:4,:)=A(2:3,:) % B의 크기는 1 by 3이지만, B의 3과 4 행을 % 행렬 A의 2-3 행으로 정의함으로서 B의 크기가 4 by 3으로 바뀐다. % 그러나 두 번째 행에 대해서는 아무런 조건이 없으므로 0이 대입된다.B = 1 4 7 0 0 0 4 5 6 7 8 9

>> G(1:6)=A(:,2:3) % A의 2와 3 열을 한 행에 여섯 열로 늘어뜨림G = 2 5 8 3 6 9

>> D=[1 2 3 4; 5 6 7 8; 9 10 11 12], v=[2; 4; 8]D = 1 2 3 4 5 6 7 8 9 10 11 12v = 2 4 8

>> E=[D(:,1)-v D(:,2)-v D(:,3)-v D(:,4)-v]E = -1 0 1 2 1 2 3 4 1 2 3 4

>> E=D-[v v v v] % 바로 위의 방법보다 더 빠르게 구할 수 있다. E = -1 0 1 2 1 2 3 4 1 2 3 4

>> % 그러나 D의 열의 수를 모르는 경우 Tony's Trick을 사용하는 것이 좋다.>> c=size(D,2); % 여기서 c는 D의 column 수를 나타낸다.>> E=D-v(:,ones(1,c)) % ones(1,c)는 원소가 모두 1인 1-by-4 vector를 만든다. E = -1 0 1 2 1 2 3 4 1 2 3 4

MATLAB에서는 이러한 주소할당 방법을 응용하여 행렬의 모양과 크기를 바

꾸거나, 행렬 원소의 일부를 변화시킬 수 있는 다양한 배열 조작 함수들을 제공한다.

24 1. 배열과 행렬

배열 조작 함수들

flipud(A) 주어진 행렬 A를 상하 방향으로 교환한다.

fliplr(A) 주어진 행렬 A를 좌우 방향으로 교환한다.

rot90(A) 행렬 A를 90。씩 회전한다. rot90([1 2; 3 4]) = [2 4; 1 3]

reshape(A,m,n) 행렬 A로부터 열 방향으로 가져다 m×n 행렬을 만들어 준다.

(단, 행렬 A는 m×n개의 원소를 가져야한다.)

diag(A) 행렬 A의 대각 성분을 추출한다.

diag(v) 대각 성분이 벡터 v인 정방행렬을 만든다.

tril(A) 행렬 A의 하단 삼각 행렬을 추출한다.

triu(A) 행렬 A의 상단 삼각 행렬을 추출한다.

1.7 논리배열과 부배열 찾기

0과 1로 이루어진 배열을 논리배열(logical array)라고 부른다.

예제 7.1 (논리배열)>> x=-3:3 % Create datax = -3 -2 -1 0 1 2 3

>> abs(x)>1 % x의 절대값이 1보다 크면 1(참)을, 아니면 0(거짓)을 돌려준다ans = 1 1 0 0 0 1 1

>> y=x(abs(x)>1) % x의 절대값이 1보다 큰 경우의 x값을 돌려준다y = -3 -2 2 3

위 예제의 마지막 두 경우를 살펴보면 위의 것은 [1 1 1 1 0 0 0]으로

배열의 크기가 x와 같으므로 y는 0과 1의 논리적 배열(0-1 logical array)로 인식하여

1에 해당하는 원소만으로 구성된 부배열을 만든다. 반면에 아래의 경우는 배열 [1 1

1 1]은 x보다 크기가 더 작으므로 y는 이것을 수치적 인덱스(numerical index)로 생각

하고 부배열을 형성한다. 그러나 이 두 가지를 섞어서 혼란스럽게 사용하면 아래 예제

와 같은 에러 메시지가 나온다*1.

1) 최근 버전의 MATLAB은 논리배열과 인덱스 배열의 혼란을 방지하기 위해 논리배

열을 이용한 부배열 선택을 허용하지 않고 있다.

1.7 논리배열과 부배열 찾기 25

예제 7.2 (배열 인덱스)>> y=x([1 0 1 0]) % [1 0 1 0]은 x와 같은 크기가 아니므로 배열의 % 인덱스로서 0을 인식하지 못한다??? Index into matrix is negative or zero.

>> x(abs(x)>1)=[] % abs(x)>1인 경우의 값들을 제외한 나머지 x의 원소만 나타냄x = -1 0 1

행렬(matrix)에서도 역시 관계 연산이 가능하다.

예제 7.3 (행렬의 관계 연산)>> B=[5 -3;2 -4]B = 5 -3 2 -4

>> x=abs(B)>2 % 행렬에 대한 관계 연산자의 적용x = 1 1 0 1

>> y=B(abs(B)>2)y = 5 -3 -4

MATLAB에서는 find 함수를 이용하여 배열의 인덱스 등을 쉽게 찾을 수 있

다. find 함수는 배열에서 뿐 아니라 행렬에서도 사용된다.

배열 찾기

i=find(x) 배열 x의 원소가 영이 아닌 인덱스를 반환한다.

[r,c]=find(X) 배열 X의 원소가 영이 아닌 행과 열의 인덱스를 반환한다.

예제 7.4 (find 함수)>> x=-3:3x = -3 -2 -1 0 1 2 3

>> k=find(abs(x)>1) % find 함수를 이용해서 절대값이 1 보다 큰 경우의 % 배열 x의 인덱스를 찾음k = 1 2 6 7

>> A=[1 2 3; 4 5 6; 7 8 9]

26 1. 배열과 행렬

A = 1 2 3 4 5 6 7 8 9>> [i,j]=find(A>5) % 인덱스 i와 j에 각각 행과 열의 인덱스가 저장된다i = 3 3 2 3j = 1 2 3 3

1.8*2성긴 행렬

많은 실용적 문제에서, 0 아닌 값을 극히 일부만 포함한 행렬들이 있는데, 이

러한 행렬들을 성긴 행렬(sparse matrix)이라고 말한다. 예를 들어 length(A)>100 정도

로 행렬이 크고 0인 원소들의 비율이 매우 높다면, 0인 원소들을 저장하는데 컴퓨터 공

간이 허비될 뿐만 아니라, 이 0인 원소에게 연산자들을 실행시키는데 있어서 컴퓨터의

계산자원이 낭비된다. 0인 원소들의 저장을 제거하기 위해, 단지 0 아닌 원소들만의 행

과 열의 위치를 각각 두 집합으로 나누어 담아서 저장하는 것이 일반적이다. 또한, 0인

원소들에 대한 수리 연산자들의 실행을 막기 위해서, 특별한 계산방법들이 기존의 행렬

문제를 푸는 방식에서 발전되어 왔다.

MATLAB에서는 간단하게 성긴 행렬(sparse matrix)을 단지 정해진 꽉 찬 행

렬(regular full matrix)로서 변수 안에 저장한다. 성긴 행렬은 MATLAB 함수 sparse

를 사용하여 만들 수 있다. 아래 예에서는 sparse 함수를 이용해서 10 by 10 identity

matrix를 만들었다. sparse(i,j,k) 함수는 k 번째 0 아닌 원소가 s(k)인, 이때 s(k)는 행

i(k)와 열 j(k)에 나타나는 원소인 성긴 행렬을 만들어 준다.

예제 8.1 (성긴 행렬)>> As=sparse(1:5,1:5,ones(1,5)) As = (1,1) 1 (2,2) 1 (3,3) 1

2) 성긴행렬과 관련된 기능은 MATLAB 일부 최신 버전에서만 이용 가능하다.

1.8 성긴 행렬 27

(4,4) 1 (5,5) 1>> As=sparse(eye(5))As = (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1 (5,5) 1>> A=full(As) % 성긴 행렬의 전체적인 형태를 full 함수를 이용하여 볼 수 있다.A = 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

>> clear % 모든 변수들을 지움>> B=eye(200) % FULL 200-by-200 identity matrix>> Bs=sparse(B) % Sparse 200-by-200 identity matrix>> whos % Bs는 단지 0.5%의 0 아닌 원소만을 포함하고 % 3200 bytes만을 저장하면 된다. Name Size Elements Bytes Density Complex B 200 by 200 40000 320000 Full No Bs 200 by 200 200 3200 0.0050 No

다음은 여러 성긴 행렬 함수들(sparse matrix functions)을 나타낸 표이다.

성긴 행렬과 관련된 Matlab 함수들

colmmd 열의 최소 Reorder by column minimum degree

colperm Reorder by ordering columns based on nonzero count

condest Estimate 1-norm matrix condition

dmperm Reorder by Dulmage-Mendelsohn decomposition

find Find indices of nonzero entries

gplot Graph theory plot of sparse matrix

nnz Number of nonzero entries

nonzeros Nonzero entries

normest Estimate 2-norm

nzmax Storage allocated for nonzeros

randperm Random permutation

spalloc Allocate memory for nonzeros

28 1. 배열과 행렬

성긴 행렬과 관련된 Matlab 함수들

spaugument Form least squares augmented system

spconvert Convert sparse to external system

spdiags Sparse matrix formed form diagonals

speye Sparse identity matrix

spones Replace nonzeros with ones

spparms Set sparse matrix routine parameters

sprandn Sparse random matrix

sprandsym Set sparse matrix routine parameters

sprank Structural rank

spy Visualize sparse structure

symbfact Symbolic factorization analysis

symmd Reorder by symmetric minimum degree

symrcm Reorder by reverse Cuthill-McKee algorithm

1.9 기록 파일 만들기와 그림 파일 저장하기

MATLAB을 사용하다 보면 자신이 입력한 명령어와 계산 결과를 저장하고 싶

은 경우가 생긴다. 이때 이용할 수 있는 명령어가 diary 명령어이다. diary

file_name.txt라는 명령어를 수행하면, 이후 사용자의 입력과 계산 결과를 모두

file_name.txt에 저장하여 준다. 이러한 저장 작업을 멈추려면 diary off, 다시 저장을

계속하려면 diary on이란 명령어들을 이용할 수 있다. 이렇게 저장된 명령어는 이후 텍

스트 문서 편집기나 글과 같은 문서 편집기로 불러들여 작업할 수 있다. 계산한 결과

값을 save 명령어를 이용하여 Mat 파일에 저장하였다가, 이후 필요한 때에 load 명령

어를 이용하여 불러올 수도 있다. Diary 명령어가 계산 과정중 화면상에 나타나는 출력

을 저장하는데 반하여, save와 load 명령어는 MATLAB이 기억하고 있는 변수 값을

저장하거나 읽어 온다는 점에서 차이가 있다.

Plot 명령어를 이용하여 그려진 그림을 프린터로 출력하려면, 그림 창 상단에

있는 File 메뉴에서 출력(Print) 명령을 이용하면 된다. 직접 출력하는 대신, 윈도우 버

퍼에 저장하여, 문서편집기나 그림편집기에서 편집할 수도 있다. 이와 같이 하려면,

MATLAB 그림창에 있는 Edit 메뉴의 그림복사 (Copy Figure)하기 명령을 이용하여

windows buffer에 저장한 후, 문서 편집 혹은 그림 편집 프로그램에서 붙여넣기(Paste)

명령을 이용하여 그림창에 있는 그림을 복사할 수 있다. 이 보다 더 확장된 그림 저장

기능을 원한다면, print 명령어를 이용할 수 도 있다.

1.10 연습문제 29

예제 9.1 (Diary 저장과, Mat-File 저장, 그리고 그림화일 저장)>> diary sec19.txt % 아래에 나타나는 출력을 sec19.txt에 저장한다.>> x = -pi:0.01:pi;>> % My work will be saved on sec19.txt>> y = sin(x);>> save sec19 x y %변수 x,y의 값을 sec19.mat 파일에 저장한다.>> clear %모든 저장 변수값을 소거한다.>> load sec19 %sec19.mat에 저장된 변수값을 읽어 온다.>> plot(x,y)>> print -dbmp sec19.bmp %그림창에 나타난 그래프를 bmp형식으로 저장한다.>> diary off

1.10 연습문제[#1 - #10 : Review Problems]

#1. 다음과 같이 주어진 A, B에 대하여 (a) A+B, (b) 2A, (c) 3B, (d) 3A-2B를 구하여라.

A= ( )2 3 -54 -1 6

와 B= ( )1 -3 43 0 1

>> A = [2 3 -5; 4 -1 6]; B = [1 -3 4; 3 0 1];>> A+B, 2*A, 3*B, 3*A-2*B

#2. 만약 A와 B가 1번 문제에서 주어진 행렬이라면,

12(2A+B)+X=3B

의 조건을 만족하는 행렬 X를 구하여라.

>> X= 3*B - 1/2 * ( 2*A + B)

#3. A=

1 2 3 4 56 7 8 9 1011 12 13 14 15

라 하자.

(a) A의 크기는 얼마인가?

(b) a13, a31, a25 과a34 를 찾아라.

>> A = [ 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15];>> size(A)

30 1. 배열과 행렬

>> a13=A(1,3), a31=A(3,1), a25=A(2,5), a34=A(3,4)

#4. 위 문제에서 값이 각각 (a)4, (b)7 (c)15인 원소들의 행과 열의 위치를 찾아라.

>> [i,j] = find(A==4)>> [i,j] = find(A==7)>> [i,j] = find(A==15)

#5. A=

2 1 03 2 01 0 1

와 B=

1 1 1 02 1 1 02 3 1 2

이다.

(만약 정의 된다면) AB 와 BA를 구하여라.

>> A = [2 1 0; 3 2 0; 1 0 1]; B=[1 1 1 0; 2 1 1 0; 2 3 1 2];>> A*B>> % B*A % it's not defined (!)

#6. 주어진 A=

1 0 00 1 01 1 0

와 B=

1 0 00 1 10 0 1

에 대해서,

AB와 BA를 구하여라. AB = BA인가?

>> A = [1 0 0; 0 1 0; 1 1 0]; B=[1 0 1; 0 1 1; 0 0 1];>> AB=A*B, BA=B*A>> AB==BA % 정수값을 가지는 행렬이 동치인가를 비교하여 얻은 논리배열>> all(AB==BA) % 각 행의 원소가 모든 같은 값을 가지면 1을 출력>> all(all(AB==BA)) % 모든 원소가 같은 값을 가지면 1을 출력

#7. A= ( )1 4 -13 0 2

,B=

3 0 12 1 34 1 2

,C=

2 10 2

-3 1이다.

(AB)C = A(BC)임을 보여라.

>> A = [1 4 -1; 3 0 2]; B=[3 0 1; 2 1 3; 4 1 2]; C=[2 1; 0 2; -3 1];>> (A*B) * C == A * (B*C)>> all(all( (A*B)*C == A*(B*C) )) % integer matrix equality check

1.10 연습문제 31

#8. 2×2 행렬 A, B, C에 대해서, 다음을 증명하여라.

(a) A(B + C) = AB + AC.

(b) (A + B)C = AC + BC.

>> A=rand(2,2); B=rand(2,2); C=rand(2,2);>> A*(B+C) - (A*B+A*C) %#% A*(B+C) == A*B + A*C>> (A+B)*C - (A*C+B*C) %#% (A+B)*C == A*C + B*C

#9. 임의의 반대칭(skew-symmetric) 행렬A에 대하여 A 2가 대칭(symmetric) 행렬임을 증

명하여라.

>> A = rand(4); A = (A-A')/2; A2 = A^2;>> A2 - A2', max(max(abs(A2-A2')))

#10. 민주당과 공화당 후보에 대한 유권자들의 표본을 추출하여 선호도를 조사하여, 다

음과 같은 표를 만들었다.

민주당 공화당 그 외

후보자 후보자 후보자 미결정

민주당원 523 107 48 16

공화당원 12 349 6 2

무소속투표자 157 112 18 264

(a) 대응하는 행렬을 작성하여라.

(b) 얼마나 많은 민주당원과 인터뷰를 하였는가?

(c) 얼마나 많은 유권자들이 공화당 후보자를 선호하는가?

(d) 지지하는 후보자를 결정하지 않은 무소속 투표자는 얼마나 되는가?

>> P = [523 107 48 16; 12 349 6 2; 157 112 18 264];>> di = sum(P(1,:))>> rc = sum(P(:,2))>> iu = P(3,4)

#11. A= ( )1 -12 2

,B= ( )-1 10 -3

일 때 A + B, 3B, -2B, A+2B, A-B, B-A를 구하여라.

32 1. 배열과 행렬

#12. 다음 식을 만족하는 2×2 행렬 A, B를 구하여라.

(a) A-2B= ( )1 2-1 1

,A-B= ( )2 11 -1

(b) A-B= ( )1 -21 3

,A+B= ( )3 03 1

#13. 다음에서 (AB)C와 A(BC)를 구하여라.

(a) A= ( )1 21 1

, B= ( )-1 01 0

, C= ( )1 33 1

(b) A= ( )2 4 23 0 -1

, B=

1 1 02 0 03 0 0

, C=

1 03 01 5

#14. A= ( )1 23 -1

,B= ( )2 01 1

에서 AB, BA를 구하여라.

#15. A=

0 1 10 0 10 0 0

에 대하여 A2, A3, A4를 구하여라.

#16. 다음의 특별한 행렬 A=

2 3 41 0 20 1 2

와 B=

2 -1 3 10 1 -1 31 0 0 2

에 대해서

(AB) T=BTAT 임을 보여라.

#17. 위 문제에서 주어진 행렬 A에 대해서 AAT 가 대칭(symmetric)임을 확인해 보아

라.

#18. 다음 각 항목에서 제시한 목적을 달성하기 위한 Matlab 명령문을 작성하여라.

(a) 주어진 A와 같은 크기이고 원소 값이 모두 pi인 행렬 B 만들기

(b) 임의의 5×5 대칭행렬 A 만들기

(c) 같은 크기의 주어진 두 정수 행렬 A와 B가 같으면 0, 그렇지 않으면 1을 계산

(d) 임의의 크기를 가진 정수 행렬 A와 B가 같으면 1, 그렇지 않으면 0을 계산

(e) 주어진 벡터 x의 양수 원소만을 가진 벡터 y 만들기

1.10 연습문제 33

#19. N≥2인 임의의 N에 대해서, 임의의 정수 행렬 A를 만들고 (AN)T=(AT )N 임을

확인해 보아라.

#20 A가 임의의 반대칭(skew-symmetric) 행렬이라 하자. ATA의 대각선(main diagonal)

원소들을 찾아보아라.

#21. 삼각형의 세 꼭지점 A(1,2,3), B(2,3,4), C(2,4,8)에 대하여, a=변BC, b=변CA, c=변AB

의 길이와 ta=각A, tb=각B, tc=각C를 구하여라.

#22. 주어진 배열

의 일부 원소로 구성된 부배열 y =

구하기 위한 Matlab 명령문을 작성하여라.

#23. 주어진 2차원 배열 A=[1 2 3; 4 5 6; 7 8 9]에 대하여, 배열의 저장순서를 참고하여

s1 = sum(A), s2 = sum(A(1:3:9)), B = A(:)의 수행 결과 값을 구하여라.

#24. 다음 각각의 Matlab 명령문에 대하여, 명령이 수행 가능하면 그 결과 값을 쓰고

수행 불능이면 수행이 되지 않는 이유를 설명하여라.

(a) x = [1:3:10]'*[1:3:10] (b) x = [1:4:10]*[1:4:10]

(c) x = -3:3; y=x(x>1) (d) A=[1 2 3; 4 5 6]; A^2

(e) A=[1 2 3; 4 5 6; 7 8 9]; A(2,3)=0 (f) A=[1 2; 3 4]; A(2,6) = 1

(g) A=[1 2 3; 4 5 6; 7 8 9]; A(1:2,1)=[] (h) A=[1 2; 3 4; 5 6]; A(2) = [ ]

#25. x=linspace(-5,5,41)일 때, 다음과 같이 정의된 벡터 y를 구하는 Matlab 명령문을

작성하여라.

≤ ≤

34 1. 배열과 행렬

#26. 배열 t를 0부터 6까지 0.2 간격의 값을 가지도록 만들고 이를 이용하여,

f(t)= sin(πt)의 녹색 그래프와 g(t)= exp(-t) sin(πt)의 황색 그래프를 한 화면

에 그려라. 여기에 y= 0인 적색선을 추가하여라.

#27. 다음과 같이 주어진 수열 a n의 10번째 항까지의 합 sum을 구하여라.

12×3

,2

3×4, ⋯ , a n=

n(n+1)(n+2)

, ⋯

(Hint: n=0; sum=0와 같이 초기화하고, n = n + 1, sum = sum + n/((n+1)*(n+2)) 명령

을 10번 반복 수행한다. 이때, 위쪽 화살표↑ 키보드를 이용하면, 동일한 명령을 쉽

게 반복할 수 있다.)

#28. z=3+4i를 초기 값으로 하고 z=z 2-12z

연산을 반복하여 수행하여 수렴 값이

i인지 -i인지를 결정하여라. 초기 값을 변화시키면서 수렴 값이 i 혹은 -i가 되

는 초기값의 조건을 구하여라. (Hint: 실수 값을 초기 값으로 하면 이 반복연산은 항

상 실수 값을 가진다.)


Recommended