제 1 장 MATLAB의 소개

1.1 MATLAB의 개요

MATLAB이란 MATrix LABoratory를 뜻하는 말로서, 수치해석, 행렬연산, 신호처리 및 간편한 그래픽 기능 등을 통합하여 고성능의 수치계산 및 결과의 가시화 기능을 제공하는 프로그램이다.

MATLAB은 행렬과 벡터를 기본 자료로 사용하여 기능을 수행하는 계산환경을 제공한다.

MATLAB은 기본적으로 행렬을 자료로 다루기 때문에 dimensioning이 필요하지 않으며 통상적인 프로그래밍 언어들을 사용하여 프로그램을 작성하지 않고도 쉽게 수치 계산을 수행할 수 있다.

MATLAB의 가장 큰 특징은 M-file을 사용함으로써 특정한 해를 구하는데 필요한 응용 프로그램을 손쉽게 작성할 수 있다는 점이다.

1.2 MATLAB의 구성

MATLAB은 명령을 내리는 명령창과 M-file을 작성하는 편집기, 명령수행 결과의 일부인 그림창, 여러 가지 모듈을 이용하여 시뮬레이션을 하는 SIMULINK로 구성되어있다.

제 2 장 기본적인 MATLAB 사용법

2.1 기본적인 사항들

2.1.1 행렬의 사용법

1) 행렬의 입력 방법

- 직각 수치 행렬을 기본적인 자료의 형식으로 취급한다.

행렬의 원소 : 실수, 복소수, 문자

■ MATLAB에서 사용되는 행렬 입력방식

♤ MATLAB 명령창

♤ 내부명령 또는 함수들을 사용하여 행렬을 생성

♤ M-파일 내에서 행렬을 구성

♤ 외부의 자료 파일로부터 행렬을 불러들임

- MATLAB은 다른 프로그래밍 언어들과 달리 차원의 선언이나 형선언이 필요 없다. 컴퓨터가 사용 가능한 크기까지 자동적으로 저장공간을 할당해 준다.

■ 행렬입력의 규칙

♤ 원소들은 빈칸 또는 쉼표를 사용하여 분리한다.

♤ 전체 원소들은 대괄호( [ ] )로 감싼다.

♤ 원소의 끝에 세미콜론( ; )을 붙이면 한 행의 종료를 의미한다.

2) 행렬의 원소들

- MATLAB에서 사용되는 임의의 표현들 (수치, 함수, 수식, 문자 등)은 모두 행렬의 원소로 사용될 수 있다. 단 수치, 함수 또는 수식을 문자와 함께 행렬의 원소로 지정할 수 없다.

□ x=[-2.5  exp(2.5)  2*3/4]

x =

-2.5000   12.1825    1.5000

□ y=['abc';'x' 'y' 'z']

y =

abc

xyz

- 행렬의 원소 중에 어느 한 원소만을 추가하거나 바꾸고 싶을 때는 색인을 지정하고 원하는 값을 입력하면 된다.

□ x(5)=abs(x(1))

x =

-2.5000   12.1825    1.5000         0    2.5000

여기서 알 수 있듯이, 기존의 행렬보다 차원이 큰 범위에 원소를 삽입하면 나머지는 0이 채워지고 새로운 행렬을 생성할 때 자신의 행렬 일부를 이용하여 만들 수 있는데 이를 부행렬이라한다.

□ z=[1 3 5];

□ A=[A;z]

A =

1     2     3

4     5     6

7     8     9

1     3     5

위 예에서 보는 바와 같이 작은 행렬을 이용하여 큰 행렬에 추가할 수도 있고, 반대로 할 수 도 있다. 참고로 명령에 마지막에 세미콜론( ; )을 추가하면 명령은 실행되지만 화면에 보여주지는 않는다.

3) 복소수와 복소행렬

- MATLAB에서는 어떤 숫자 뒤에 ' i ' 또는 ' j '를 붙임으로써 복소수를 표현한다. 만약에 i 또는 j가 변수로 사용되었을 때는 복소수로 표현이 불가능해지므로 주의해야 한다.

□ z=1+2i

z =

1.0000+ 2.0000i

□ z1=1+3*j

z1 =

1.0000+ 3.0000i

□ i=2

i =

2

□ z=1+2*i

z =

5

- 복소행렬을 입력할 때 주의할 사항은 □+□ 또는 □-□ 부호 전후에 공백을 두어서는 안된다는 점이다. 만약 복소행렬을 □5 + 5i□와 같이 입력한다면 이 값은 □5+5i□의 한 원소가 아니라 □5□와 □5i□의 두원소로 인식될 것이다. 그러나 행렬의 원소가 아닌 하나의 수식을 입력하는 경우라면 공백이 있어도 상관없다.

2.1.2 기타 사항들

1) MATLAB 산술문과 변수들

- MATLAB은 수식언어이기 때문에 입력된 수식을 해석하고 계산을 수행한다. MATLAB의 산술문은 다음과 같은 형태를 취한다.

□ 변수 = 수식

□ 수식

수식은 연산자, 기타문자, 함수, 변수 등으로 구성될 수 있으며, 이 수식을 계산한 결과는 행렬로 생성된다. 변수를 지정하지 않았을 때는 수식의 결과가 □해답(answer)□를 의미하는 'ans'라는 변수에 자동으로 할당된다.

- 하나의 수식이 너무 길어서 한 줄에 모두 나타낼 수 없을 때는 각 줄마다 적당한 위치에서 하나 이상의 공백과 생략기호(□. . .□)를 붙이고 Enter를 누른 후 다음 줄에서 계속이어 쓰면 된다.

- MATLAB에서는 영문자로 시작되는 19자 이하의 문자및 숫자를 사용하여 변수 또는 함수의 이름으로 지정할 수 있다. 또한 MATLAB에서는 대문자와 소문자를 구별하며, 함수의 이름은 항상 소문자이어야 한다. 즉 'A'와 'a'는 서로 다른 변수로 인식되며, 'inv(A)'는 행렬 A의 역행렬을 의미하지만 'INV(A)'는 사용자가 특별히 정의하지 않는 한 □정의되지 않은 함수(undefined function)□로 취급된다.

2) 숫자와 산술수식

-MATLAB에서는 소수점과 음수 부호(-)를 포함한 전통적인 십진 기수법을 사용하며, 10의 거듭제곱(E 또는 e)과 복소수를 나타내는 접미사(i 또는 j)를 사용할 수 있다.

- 수식의 계산에 사용되는 산술 연산자들은 일반적으로 사용되는 것들과 같으며, 연산의 우선 순위도 마찬가지이다.

+	더하기(addition)	/	오른 나누기(right division)
-	빼기(subtraction)	\	왼 나누기(left division)
*	곱하기(multiplication)	^	거듭제곱(power)

나누기의 경우 두 가지의 나누기가 있는데 이것은 행렬 연산의 편의를 위한 것이다. 산술연산의 경우 오른 나누기와 왼 나누기는 같은 값을 갖게 되지만 행렬 연산의 경우 다른 결과를 가진다.

- inf : □1/0□과 같은 무한대를 의미한다.

- NaN : □0/0□ 또는 □inf/inf'와 같은 무의미한 수 즉 부정을 의미한다.

3) 출력 형식

- MATLAB에서는 산술문의 결과가 화면에 표시되며, 이때 표현되는 수치의 자릿수는 MATLAB의 기본 설정 값에 따라 정해져 있다. 표현의 형식을 변경하기 위해서 'format'이라는 명령을 제공하고 있다. 그러나 □format□ 명령은 단지 화면상에 표시되는 수치의 표현 형식만을 변경시킬 뿐이다.

표현 형식	-5/4	1.23456e-5	12345.6
short	-1.2500	1.2346e-005	1.2346e+004
short e	-1.2500e+00	1.2346e-005	1.2346e+004
long	-1.25000000000000	1.234560000000000e-005	1.234560000000000e+004
long e	-1.250000000000000e+00	1.234560000000000e-005	1.234560000000000e+004
bank	-1.25	0.00	12345.60
hex	bff4000000000000	3ee9e3fe580f5495	40c81cccccccccd
+	-	+	+

4) 작업 공간에 대한 정보

지금까지의 예들은 MATLAB에서 □작업공간(workspace)□이라고 부르는 영역에 사용한 변수들이 저장된다. 이러한 작업공간 사용된 변수들을 알아보기 위해서는 다음과 같이 하면 된다.

□ who

Your variables are:

A         i         y         z1

ans       x         z

□ whos

Name      Size         Bytes  Class

A         4x3             96  double array

ans        1x1              8  double array

i          1x1              8  double array

x          1x5             40  double array

y          2x3             12  char array

z          1x1             16  double array (complex)

z1         1x1             16  double array (complex)

Grand total is 27 elements using 196 bytes

위와 같이 'who'나 'whos'를 이용하여 현재 작업공간상에 존재하는 변수들에 대한 정보를 얻을 수 있다.

6) 도움말 기능

- MATLAB과 관련된 대부분의 내용에 대하여 내장도움말이 제공되는데 아무때나 help라고 입력하면 MATLAB에 관한 도움말을 얻을 수 있고 특별한 항목을 지정하여 요청하면 그 항목에 대하여 정보를 얻을 수 있다.

- help보다는 일반적인 검색 명령으로서 □lookfor'가 있는데, 예를 들어 'lookfor inverse'라고 입력하면 약간의 검색 시간이 지난 후에 M-file도움말 주석의 첫 번째 줄에 'inverse'라는 단어를 포함하는 모든 함수들을 나열해 준다.

7) 작업의 종료와 저장

- MATLAB명령창에서 종료하기 위해서는 'quit'또는 'exit'라고 입력해야 하는데, 종료될 때 작업공간상에 존재하는 변수들은 모두 지워진다. 그러나 종료 전에 변수들을 저장하고 싶을 때는 'save'라는 명령어를 사용하면 된다. 이 명령은 특정한 파일의 이름과 변수들의 이름을 지정하지 않으면 'MATLAB.MAT'라는 이름의 파일에 모든 변수들을 저장한다.

이후에 MATLAB실행하고 나서 'load'명령을 사용하여 현재의 작업공간상에 다시 불러들일 수 있다.

□ save scc A B C

다음과 같이 입력하면 'scc.mat'라는 이름의 파일에 변수 'A','B','C'가 저장된다.

□ load scc

라고 입력하면 파일 'scc.mat'에 있는 모든 변수들이 현재의 작업공간상으로 불러들인다.

2.2 행렬 및 벡터의 연산 및 조작법

2.2.1 전치 행렬

- MATLAB에서는 어떤 행렬의 전치 행렬을 표시하기 위해서 작은따옴표( ' )를 사용한다.

□ A

A =

1     2     3

4     5     6

7     8     9

1     3     5

□ A'

ans =

1     4     7     1

2     5     8     3

3     6     9     5

작은따옴표( ' )는 A'와 같이 행렬 변수에 붙일 수도 있고, [1 2 3]'와 같이 행렬 표현 자체에 붙일 수도 있다.

- 복소행렬은 작은따옴표를 붙이면 단순한 전치행렬이 아닌 공액 복소 전치행렬을 얻게된다. 그러므로 복소전치행렬을 수행하기 위해서는 전치한 행렬에 공액을 취하면 된다.

□ Z=[1-2i 2+3i 3-4i;2+1i 3-2i 4+3i]

Z =

1.0000- 2.0000i   2.0000+ 3.0000i   3.0000- 4.0000i

2.0000+ 1.0000i   3.0000- 2.0000i   4.0000+ 3.0000i

□ Z'

ans =

1.0000+ 2.0000i   2.0000- 1.0000i

2.0000- 3.0000i   3.0000+ 2.0000i

3.0000+ 4.0000i   4.0000- 3.0000i

□ conj(Z')

ans =

1.0000- 2.0000i   2.0000+ 1.0000i

2.0000+ 3.0000i   3.0000- 2.0000i

3.0000- 4.0000i   4.0000+ 3.0000i

2.2.2 행렬의 사칙연산

1) 행렬의 덧셈 및 뺄셈

- 행렬의 덧셈 및 뺄셈에는 숫자의 덧셈 및 뺄셈과 마찬가지로 □+□와 □-□기호를 사용한다. 단 행렬 연산의 대상이 되는 두행렬의 차원이 같아야 한다.

- 행렬 또는 벡터의 덧셈과 뺄셈은 각 행렬의 같은 위치, 즉 행렬 상의 색인이 같은 원소끼리 이루어진다.

- 서로 차원이 다른 경우에 연산이 불가능했지만, 예외적으로 1×1 행렬인 스칼라의 경우에는 어떤 한 행렬이나 벡터와도 연산이 가능하다. 이 경우에는 행렬이나 벡터의 모든 원소들에 스칼라를 더하거나 빼면 된다.

□ A=[1 2 3;4 5 6];

□ B=[2 4 6;1 3 5];

□ C=A+B

C =

3     6     9

5     8    11

□ C-5

ans =

-2     1     4

0     3     6

2) 행렬의 곱셈

- 행렬의 곱셈은 □*□를 사용하여 표시하며, 연산의 대상이 되는 두 행렬 또는 벡터의 내부 차원(inner dimension)이 일치할 경우에만 정의한다.

3) 행렬의 나눗셈

- 행렬의 나눗셈은 스칼라와는 달리 일반적으로 좌측 나누기와 우측 나누기의 결과가 일치하지 않는다.

♤ 좌측 나누기 : X=A\B -----> A*X=B의 해 (X = inv(A)*B)

♤ 우측 나누기 : X=A/B -----> X*B=A의 해 (X = A*inv(B))

2.2.3 벡터와 행렬의 조작법

1) 벡터의 생성

- 벡터를 만들고자 할 때는 □시작값:증가분:최종값□의 형식으로 지정하면 된다. 증가분을 지정하지 않고 □시작값:최종값□의 형태로 입력하면 자동적으로 증가분은 1이된다.

□ x=1:5

x =

1     2     3     4     5

□ y=0:.5:3

y =

0    0.5000    1.0000    1.5000    2.0000    2.5000    3.0000

□ z=5:-1:-5

z =

5     4     3     2     1     0    -1    -2    -3    -4    -5

콜론(:)을 사용하여 벡터를 생성하면 기본적으로 행 벡터가 생성된다. 열 벡터로 만들고자 한다면 작은따옴표를 사용하여 열 벡터로 전환시키면 된다.

-그 밖의 벡터 생성 함수

♤ logspace : 대수적으로 등간격인 벡터를 생성

♤ linspace : 원소들 간의 간격이 아닌 원소의 개수를 지정하여 선형적으로 생성

2) 첨자 붙이기

- MATLAB에서는 첨자(subscript)를 사용함으로써 행렬의 각 원소들을 표시할 수 있다. 즉 행렬의 이름에 괄호 안에 첨자(원소의 색인)를 입력함으로써 해당원소를 표시할 수 있다. 첨자에 정수대신 수식을 사용할 경우에는 그 수식의 결과 값과 가장 가까운 정수가 대입되어 원소의 색인으로 사용된다.

□ A=[0 1 2;4 5 6;8 9 10]

A =

0     1     2

4     5     6

8     9    10

□ A(1.24*2, 6/2.5)

Warning: Subscript indices must be integer values.

ans =

5

□ A(1,1)=A(2,2)-A(3,3)

A =

-5     1     2

4     5     6

8     9    10

♠ 행렬에 벡터 첨자를 사용하여 행렬내의 일부분을 지정할 수 있다.

- 부행렬 지정방법  :  (시작행 : 끝행, 시작열 : 끝열)

예로 행렬 A가 10×10의 정방 행렬이라고 가정하자.

♤ A(1:5, 3) : 1행부터 5행까지의 원소중에 3번째 있는 원소들(열 벡터)

♤ A(1:5, 5:10) : 1행부터 5행까지의 원소중 7열부터 10열까지의 원소(5×3의 부행렬)

♤ A(:, 5) : 5번째열에 있는 원소들(10×1의 열 벡터)

♤ A(1:2, :) : 1행부터 2행까지의 모든 원소들(2×10의 부행렬)

♠ 벡터를 행렬의 첨자로 사용하면 각 벡터의 원소들이 행렬의 첨자로 지정된다.

- x와 y가 벡터일때 'A(x,y)'라고 입력하면 행렬 A의 원소들 중에서 벡터 x의 원소들과 벡터 y의 원소들이 각각 행 첨자와 열 첨자를 나타내는 행렬 A의 원소들로 구성된 새로운 행렬을 만든다.

예) x가 1, 2, 3이고 y가 3, 2, 1인 벡터라 하고 A는 아래와 같다고 할 때 A(x,y)	와 A(y,x)를 나타낸 것이다.

□ A

A =

-5     1     2

4     5     6

8     9    10

□ A(x,y)

ans =

2     1    -5

6     5     4

10     9     8

♠ 'A(:)' 콜론이 하나뿐인 표현법

- 'A(:)'가 등호(=)의 우측, 즉 할당문의 우변에 있는 경우에는 행렬 A의 원소들이 열 위주    로 일렬로 된 열 벡터가 구성된다.

- 'A(:)'가 등호(=)의 좌측에 놓이게되면 행렬의 형태 또는 크기를 바꾸게 된다.

□ A=[1 2;5 6]

A =

1     2

5     6

□ b=A(:)

b =

1

5

2

6

□ A(:)=2:2:8

A =

2     6

4     8

3) 빈 행렬

- 변수는 존재 하지만 원소가 하나도 없는 빈 행렬 즉 0×0 행렬을 의미한다.

□ x=[ ]

x =

[ ]

- 임의의 행렬 중에서 특정한 행이나 열을 제거하는데 효과적인 방법으로 빈 행렬이 사용된다.

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

A =

1     2     3

4     5     6

7     8     9

□ A([1 3], : )=[ ]

A =

4     5     6

- 행렬을 지우기 위해서는 'clear '이후에 변수의 이름을 쓰면 된다.

4) 특별한 행렬

- MATLAB에서는 선형 대수학이나 신호 처리 분야에서 취급되는 특별한 행렬들을 생성하는 함수들을 제공한다.

♤ compan	- 동반 행렬(Companion matrix)

♤ diag	- 대각 행렬(Digonal matrix)

♤ gallery	- 시험 행렬(Test matrix)

♤ hadamard	- Hadamard 행렬

♤ hankel	- Hankel 행렬

♤ hilb	- Hilbert 행렬

♤ invhilb	- Hilbert 행렬의 역행렬

♤ kron	- Kronecker 텐서 곱(tensor product)

♤ magic	- 마방진

♤ pascal	- Pascal의 삼각형

♤ toeplitz	- Toeplitz 행렬

♤ vader	- Vandermonde 행렬

- 그 이외에 실용적인 행렬들

♤ zeros	- 0만으로 구성된 행렬

♤ ones	- 1만으로 구성된 행렬

♤ eye	- 단위 행렬

2.3 배열 연산

- 배열 연산(Array operation)이란 *, \, /, ^ 또는 ' 기호에 의하여 이루어지는 일반적인 선형 행렬 연산이 아닌 행렬의 원소와 원소 사이에 성립되는 산술 연산을 가리킨다.

2.3.1 배열의 사칙연산

1) 배열 연산의 덧셈과 뺄셈

- 일반적으로 행렬의 덧셈과 뺄셈이 행렬의 원소 대 원소의 연산으로 정의되기 때문에 배열 연산의 덧셈과 뺄셈과의 차이는 없다.

2) 배열 연산의 곱셈 및 나눗셈

- □ .* □는 배열 연산의 곱셈을 나타내며, 두 행렬의 차원이 같을 때 각 행렬의 같은 위치에 있는 원소들끼리 곱셈을 하여 새로운 행렬을 구성한다.

□ A=[1 2 3;4 5 6];

□ B=[1 3 6;7 8 9];

□ A.*B

ans =

1     6    18

28    40    54

- 배열 연산의 나눗셈에는 □ ./ □와 □ .\ □의 두가지가 있는데 모두 각 행렬의 원소들간의 몫을 구해 준다.

□ A./B

ans =

1.0000    0.6667    0.5000

0.5714    0.6250    0.6667

□ A.\B

ans =

1.0000    1.5000    2.0000

1.7500    1.6000    1.5000

□ B./A

ans =

1.0000    1.5000    2.0000

1.7500    1.6000    1.5000

3) 배열을 사용한 거듭제곱

- □ .^ □은 원소간의 거듭제곱을 나타낸다.

□ x=[1 2 3];

□ y=[4 5 6];

□ x.^y

ans =

1    32   729

□ y.^2

ans =

16    25    36

□ 2.^[x y]

ans =

2     4     8    16    32    64

2.3.2 기타의 연산

1) 관계 연산(Relational operation)

- MATLAB에서는 차원이 같은 두 행렬에 대하여 적용할 수 있는 6가지의 관계연산자가 있다.

연산자	의 미
<	미만(less than)
<=	이하(less than and equal)
>	초과(greater than)
>=	이상(greater than and equal)
==	같음(equal)
~=	같지 않음(not equal)

위 연산자들은 두 행렬의 대응 원소들을 비교하여 그 결과를 0과 1로 구성된 행렬의 형태로 나타낸다. ( 0 : 거짓,  1 : 참 )

2) 논리 연산(logical operation)

연산자	의 미
&	그리고(and)
|	또는(or)
~	부정(not)

♤ C = A & B	: 행렬 A와 행렬 B의 대응 원소들이 둘다 0 이 아닐 경우에는 1을, 하나라	도 0이면 0을 돌려준다.

♤ C = A | B	: 행렬 A와 행렬 B의 대응 원소들중 하나라도 0이 아닐경우에는 1을, 두	원소들 중에서 어느 하나라도 0이 아닐경우에는 1을 돌려준다.

♤ B = ~A	: A의 원소가 0이 아닐 경우에는 0을, 0이 아닐 경우에는 1을 돌려준다.

♤ any(x)	: 벡터 x의 원소중에 하나라도 0이 아닌 원소가 있으면 1을 돌려주고, 모	두 0이면 0을 돌려준다.

♤ all(x)	: 벡터 x의 원소들이 모두 0이 아니면 1을, 하나라도 0인 원소가 있으면 0	을 돌려준다.

제 3 장 M-파일의 작성 및 사용

3.1 흐름 제어문

3.1.1 FOR 루프

- 하나 이상의 문장이 미리 정해진 횟수만큼 반복 수행된다.

□ for i=1:10

x(i)=i;

end

□ x

x =

1     2     3     4     5     6     7     8     9    10

위의 예에서 < 실행문 >에서 뒤에 □ ; □을 꼭 붙여서 루프가 한번 실행 때마다 모니터 화면상에 수행 결과가 표시되는 일을 방지해야 한다.

3.1.2 WHILE 루프

- 국부적인 조건(local condition)에 따라서 하나 이상의 문장들을 불확정적인 횟수만큼 반복하여 실행한다.

여기서 국부적인 조건은 수식이 될 수도 있고 단순히 조건이 될 수도 있다. 이 조건이 참( 0이 아니면 )일 때 수행되고 거짓( 0 이면) 이 될 때까지 수행한다.

□ i=1;

□ while i<=5

x(i)=i*2;

i=i+1;

end

□ x

x =

2     4     6     8    10     6     7     8     9    10

♠ break 문

- 루프를 빠져나가기 위한 명령어이다. 사용법은 단순히 루프 안에서 빠져나가기 원하는 위치에 'break'라고 쓰면 된다.

3.1.3 IF 문

- 조건문이 참일 때 실행문을 행한다. 여기서 □참□이란 조건문이 □0□이 아닌 수이거나 임의의 조건을 만족할 때이다.

위와 같이 'elseif'를 사용하여 여러 조건에 대하여 실행문을 분리할 수 있다.

3.1.4 switch 문

- switch 문은 변수나 표현에 의해서 임의의 실행문이 선택적으로 수행된다.

expression에 해당하는 경우가 있으면 그곳의 실행문을 실행하고, 경우 같은 것이 없을 때는 otherwise의 실행문을 실행한다.

switch input_num

case -1

disp('negative one');

case 0

disp('zero');

case 1

disp('positive one);

otherwise

disp('other value');

end

3.2 M-파일 작성 : 스크립트와 함수

- MATLAB에서는 일련의 명령들을 파일 내에 저장했다가 한꺼번에 실행할 수 있다.

MATLAB의 실행문장들을 포함하고 있는 디스크 파일을 'M-파일'이라고 부르는데, 그 이유는 이 파일의 확장자가 □ .M □이기 때문이며 확장자 □ .M □은 매크로 파일을 의미하기도 한다.

- M-파일은 일련의 정상적인 MATLAB 실행 문장 등으로 구성되어 있으며, 실행 문장들 중에는 다른 M-파일을 참조하는 문장도 있을 수 있다. 또한 M-파일은 자체 M-파일 내에서 그 자신을 부를 수도 있다(recursive call). 이러한 M-파일은 문자 편집기나 워드 프로세서를 사용하여 작성할 수 있으며, ASCII 코드로 구성되어있다. 참고로 ver4.0과 그 이하에서는 M-파일 편집기가 특별히 있지 않고 단순히 WIN 95의 Note Pad를 사용하는데 이 프로그램은 모든 파일의 확장자를 무조건 ' .txt '로 하여 약간의 불편함이 있다. MATLAB 5.0에서는 M-파일 편집기가 따로 있다.

- 스크립트와 함수

♤ 스크립트 파일 : 일련의 긴 명령들을 한꺼번에 자동적으로 수행해 주는 파일.

♤ 함수 파일 : 스크립트와 비슷하나 인자를 줄 수 있다.

3.2.1 스크립트 파일

- 스크립트 파일을 실행시키면, MATLAB은 단순히 파일 내에 들어있는 명령을 차례대로 실행시킨다.

- 스크립트 파일 내의 문장들은 MATLAB작업 공간상의 자료들을 전역변수로 취급하여 처리한다. 즉 스크립트 파일에 의해 생성되거나 사용된 변수들은 현재의 명령창 작업공간 상에 그대로 남아있게 된다.

3.2.2 함수 파일

- 파일이 시작되는 첫줄에 □function□이라는 단어가 들어 있는 M-파일이 함수 파일이다.

이것이 스크립트와의 가장 큰 차이점이다. 이 □function□이 없으면 스크립트로 인식된다.

- 파일이름의 이름으로 사용된 이름이 함수의 이름과 같아야한다.

- 함수 내에서 사용될 인자 값을 줄 수 있다.

- 함수 내에서 사용된 모든 인자 값은 함수파일이 실행된 후에 작업공간상에 존재하지 않는다. 즉 함수파일은 변수들이 그 함수에 국한될 뿐이라는 것이다.

- □%□ 기호 뒤에 나오는 문장들은 주석으로 인식되어 무시된다.

- □%□ 기호와 함께 적어 놓은 설명 부분은 MATLAB프롬프트에서 □help mean□ 이라고 입력하였을 때 화면상에 표시된다.

- 첫 번째로 □%□ 기호이후의 주석은 □look for mean□ 이라고 입력하면 화면에 □mean□이라는 단어를 포함하는 항목을 모두 보여준다.

♠ 부함수(Subfunctions)

- 함수 파일은 하나 이상의 함수를 가질 수 있다. 첫 번째 함수는 primary function이고 이 함수가 M-파일의 이름이 된다. 한 M-파일 안의 두 번째 함수부터 부함수가 된다.

- 각각의 부함수들은 함수 파일의 첫 번째 줄에서의 형식과 동일한 형식을 띄나 함수의 이름은 달라야 한다.

function [tot, avg]=test1(A)

% TEST1 find mean and total value with vector

n=length(A);

tot=total(A,n);

avg=mean(A,n);

function t=total(v,n)

% Calculate total value.

t=0;

for i=1:n

t=v(i)+t;

end

function m=mean(v,n)

%Calculate average.

m=sum(v)/n;

3.2.3 MATLAB 사용을 매끄럽게 하는 명령들

♤ echo	: 이 명령을 사용하면 M-파일이 실행될때 각각의 명령들이 모니터 화면에	나타난다. 디버깅에 유용하다.

♤ input	: M-파일이 실행될때 사용자가 자료를 입력할 수 있도록 해준다. 이 명령	은 대화식으로 프로그램을 진행시킬때 유용하다. □input□을 실행시키면 자	료가 입력될 때까지 더 이상 프로그램을 실행하지 않고 대기상태로 머무	르게 된다.

♤ keyboard	: 이 명령은 컴퓨터의 자판을 마치 스크립트 파일처럼 사용하도록 해준다.	M-파일 내부에 이 함수를 삽입해 놓으면, 파일의 잘못된 곳을 고치거나	파일이 수행되는 동안에 변수를 수정하는데 유용하게 사용될수 있다.

♤ pause	: 프로그램의 실행을 일시적으로 중지시키는 기능을 수행한다. □pause□가	실행되면 사용자가 자판을 누를 때까지 프로그램의 실행이 중지한다.	□pause(n)□이라고 입력하면 n초동안 정지한 다음 계속해서 프로그램이 실	행된다.

3.2.4 전역변수

- M-파일로 정의된 MATLAB함수들은 자체적으로 지역변수들을 사용한다. 지역변수들은 다른 함수의 변수들, 기본 작업 공간의 변수들 및 스크립트 파일의 변수들과 분리되어 취급된다.

- 변수를 전역변수로 선언하면 선언한 함수와 MATLAB 작업공간은 물론이고 다른 함수에서도 그 변수를 공유하게된다.

3.2.5 문자열

- MATLAB에서 문자열을 입력하고자 할 때에는 원하는 문자열의 전후에 작은따옴표(')를 붙이면 된다.

□ s='MATLAB'

s =

MATLAB

□ size(s)

ans =

1     6

□ abs(s)

ans =

77    65    84    76    65    66

문자열 s는 원소가 6개인 행 벡터로 인식됨을 알 수 있고 □abs□를 사용하면 각 문자들의 ASCII값을 알 수 있다.

- 작은 문자열들을 하나의 긴 문자열로 합치고자 할 때에는 대괄호( [ ] )를 사용하여 그 안에 문자열을 나열하면 된다.

□ [s, ' function']

ans =

MATLAB function

- 수치값을 문자열로 바꾸고 싶을 때에는 함수 □num2str□, 및 □int2str□을 사용한다.

1) eval 함수

- 함수 □eval□은 문자열을 인수로 사용하여 강력한 문자 매크로 기능을 수행하는 함수이다. 즉, □eval(t)□라고 입력하면 문자열 t에 해당하는 함수를 실행한다. 만약 t가 □FUNCTION□이라면 이 문자열에 해당하는 함수나 수식을 수행한다.

□ x='1/(i+j)';

□ for i=1:3

for j=1:4

A(i,j)=eval(x);

end

end

□ A

A =

0.5000    0.3333    0.2500    0.2000

0.3333    0.2500    0.2000    0.1667

0.2500    0.2000    0.1667    0.1429

함수 □eval□과 □input□을 사용하면 메뉴방식으로 프로그램을 진행할 수 있다. 예를들어 □COKE.M□,□CIDER.M□,□ORANGE.M□ 및 □APPLE.M□이라는 이름의 M-파일을 작성한 후에 아래의 문장들을 스크립트 파일로 만들어 사용할 수 있다.

beverage=['coke  ';'cider ';'orange';'apple '];

i=input('Select no. of beverage you want! ');

eval(beverage(i,:))

이예제는 input에 의해서 선택된 M-파일이 실행된다. 여기서의 주의사항은 beverage는 행렬이기 때문에 각 행의 열을 마추기 위해서 모두 6자를 만들어 주었다는 것이다.

- 이번에는 5개의 일련 번호가 붙여진 자료파일들을 불러들이기 위한 방법에 대해서 알아보자.

□ file = 'data';

□ for i=1:5

eval(['load',file,int2str(i)])

end

3.3 디스크 파일

- MATLAB 명령들 중에서는 MATLAB 작업 공간상의 내용을 각각 디스크에서 불러들이고 디스크에 저장하는 기능을 수행한다.

3.3.1 자료의 유입 및 유출

1) 자료의 유입

♤ 명백한 원소들의 나열 형태로 자료를 입력한다.

♤ M-파일 형태로 자료를 생성한다.

♤ 일반 ASCII파일로부터 자료를 불러 들인다. 일반 ASCII파일은 빈칸을 사용하여 숫자들     을 구분하며, 한 줄씩 입력된 일정한 길이의 행들로 구성된 파일이다. 이러한 ASCII파일     들은 'load'명령을 사용하면 곧바로 MATLAB에서 읽어 들일 수 있으며 읽어 들인 자료     들은 원래의 파일 이름과 동일한 이름의 변수에 할당된다.

♤ 함수 □fopen□,□fread□ 및 기타 MATLAB의 저급 입·출력 함수들을 이용하여 자료를 읽어     들인다. 이 방법은 자체적인 파일 형식을 가지고 있는 다른 응용 프로그램으로부터 자료     파일을 불러들일 때 유용하다.

2) MATLAB 자료의 유출

♤ 선택사항인 □-ascii□와 함께 □save□명령을 사용하여 자료를 ASCII형식으로 저장한다.

□ A=eye(3,3)

A =

1     0     0

0     1     0

0     0     1

□ save data.out A -ascii

□ type data.out

1.0000000e+000  0.0000000e+000  0.0000000e+000

0.0000000e+000  1.0000000e+000  0.0000000e+000

0.0000000e+000  0.0000000e+000  1.0000000e+000

♤ 함수 □fopen□,□fwirte□ 및 기타의 저급의 입·출력 함수들을 사용하여 특별한 형식으로 자     료를 저장한다. 이 방법은 다른 응용 프로그램에서 요구되는 파일형식으로 자료 파일을     저장할 때 유용하다.

3.4 파일의 입·출력

- MATLAB의 파일 입·출력 함수들은 C언어의 파일 입·출력 함수에 근거를 두고 있다.

3.4.1 파일 열고 닫기

- 파일을 읽거나 쓰기 전에 먼저 □fopen□명령을 사용하여 파일을 열어야 하며, 이때 열어야 할 파일의 이름과 파일 접근 허용 문자열을 지정하여야한다.

- 파일을 열때, 파일의 용도에 따라 지정하는 파일 접근 허용문자열

♤ r	: 자료를 읽을 수 있음

♤ w	: 자료를 쓸 수 있음

♤ a	: 자료를 추가할 수 있음

♤ r+	: 자료를 읽고 쓸 수 있음

- 함수 □fopen□은 파일에 할당되는 음이 아닌 정수인 파일 식별자를 돌려준다. 파일을 읽기용인 □r□상태로 설정했으나 파일이 존재하지 않는 경우처럼 실제로 파일을 열수 없는 경우에함수 □fopen□은 파일 식별자로 -1을 돌려준다. 두 번째 반환 값은 오류에 대한 부가적인 정보를 제공한다.

- 정상적으로 작업을 수행했을 때는 1이상의 값을 돌려준다.

□ [fid, message]=fopen('dat.dat','r')

fid =

-1

message =

Cannot open file. Existence? Permissions? Memory? . . .

□ [fid, message]=fopen('data.out','r')

fid =

3

message =

''

- 파일을 읽거나 쓰는 작업을 완료한 후에는 함수 □fclose□를 사용하여 그 파일을 닫아야한다.

□ status=fclose('fid')

status =

0

□ status=fclose('all')

status =

0

작업이 정상적으로 끝나면 0을, 그렇지 않으면 -1을 돌려준다.

3.4.2 형식화된 문자 파일과 문자열 쓰기

- 함수 □fprintf□는 자료를 문자열로 변환하여 그 결과를 모니터 화면 또는 파일에 출력한다.

♤ %e - 지수적 표기

♤ %f - 고정 소수점 표기

♤ %g - %e와 %f의 표기중에서 자동적으로 짧은 것을 선택한다.

형식 지정자 중에서 선택적 필드는 최소 필드 폭과 숫자의 정밀를 조정한다.

여기서 □\n□은 Enter의 기능을 한다. 예를 보면서 좀더 이해해보면

□ x=0:.05:0.2;

□ y=[x; exp(x)];

□ fid=fopen('exp.txt','w');

□ fprintf(fid, 'Exponential function\n\n');

□ fprintf(fid, '%7.2f %12.5f\n',y);

□ fclose(fid);

□ type exp.txt

Exponential function

0.00      1.00000

0.05      1.05127

0.10      1.10517

0.15      1.16183

0.20      1.22140

- 함수 □fprintf□와 관련 있는 함수 □sprintf□는 결과를 파일이나 모니터 화면에 출력하는 대신에 문자열로 나타낸다.

□ sine5=sprintf('Sine value of %f is %10.4f.\n',.5,sin(.5))

sine5 =

Sine value of 0.500000 is     0.4794.

3.4.3 형식화된 문자 파일과 문자열 읽기

- MATLAB의 문자 입력 함수인 □fscanf□는 □fprintf□와 그 형식이 비슷하다. 함수 □fscanf□는 일반적인 문자들 및 전환 지정자를 포함하는 형식 조정 문자열과 현재 열려있는 문자 파일의 파일 식별자를 인수로 사용한다.,

♤ %s - 문자열을 읽을 경우

♤ %d - 십진수를 읽을 경우

♤ %f - 부동 소수값을 읽을 경우

□ fid=fopen('exp.txt','r');

□ title=fscanf(fid,'%s');

□ [table, count]=fscanf(fid, '%f %f');

□ fclose(fid);

위와 같이 쓰면 첫번째 fscanf는 exp.txt파일의 제목을 읽고, 두번째 fscanf는 파일의 끝에 도달할때 까지 지수 함수의 값들을 한 줄씩 읽어 들인다.

- 다음과 같은 표현도 가능하다.

□ A=fscanf(fid,'%5d',100);

□ A=fscanf(fid,'%5d',[10,10]);

각각의 표현은 5자리 십진수를 100개 읽어서 열 벡터 A에 할당하고, 다음 문장은 10×10의행렬로 읽어서 A에 할당한다.