You are on page 1of 43

3장 MATLAB 프로그래밍

3.1 M-파일
3.2 입력-출력
3.3 구조 프로그래밍
3.4 내포화와 들여쓰기
3.5 M-파일로의 함수 전달
3. MATLAB 프로그래밍 52/48

학습 목표
▪ 편집창에서 M-파일을 만들어 명령창에서 불러내는 방법
▪ 스크립트 파일과 함수 파일의 차이점에 대한 이해
▪ 함수 내에 help 설명을 작성하는 방법에 대한 이해
▪ 대화식으로 입력한 정보와 결과를 나타내는 M-파일 작성법
▪ 부함수의 역할과 이것을 어떻게 호출하는지에 대한 이해
▪ 데이터 파일을 만들고 찾아오는 방법
▪ 구조 프로그램을 이용하여 논리와 반복을 수행하기 위한 M-
파일 작성법
▪ if ... elseif와 switch 구조의 차이점에 대한 인식
▪ for ... end와 while 구조의 차이점에 대한 인식
▪ 벡터화의 의미와 그 유용성
▪ 익명함수를 function 함수 M-파일에 함수로 전달하는 방법

2
3. MATLAB 프로그래밍 53/49

3.1 M-파일(프로그램 파일)


▪ 지금까지는 명령 창에서 한번에 하나 씩 명령을 입력하
는 방법을 사용
▪ 여러 명령이 들어 있는 파일을 만든 후 이 파일을 실행
시키는 방법이 있다.
▪ 이 파일을 M-파일이라 부르고 확장자는 .m
▪ M-파일의 종류
• 스크립트 파일
• 함수 파일

3
3. MATLAB 프로그래밍 53/49

스크립트 파일(Script File)


▪ 스크립트 파일은 일련의 MATLAB 명령 저장된 M-파일이
다. 여러 번 실행이 필요할 때 유용하다.
▪ 스크립트 실행 방법
• 명령 창에서 파일 이름을 입력
• 편집기 탭에서 실행 아이콘을 클릭
scriptdemo.m
g=9.81; m=68.1; cd=0.25; t=12;
v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t)

>> scriptdemo 𝑔𝑚 𝑔𝑐𝑑


v= 𝑣 𝑡 =
𝑐𝑑
tanh
𝑚
𝑡
50.6175

4
3. MATLAB 프로그래밍 53/49

예제 3.1: 스크립트 파일
▪ 자유낙하 하는 사람의 속도는 다음과 같다.
𝑔𝑚 𝑔𝑐𝑑
𝑣 𝑡 = tanh 𝑡
𝑐𝑑 𝑚

여기서 𝑣는 속도(m/s), 𝑔는 중력가속도(9. 81m/s 2 ),


𝑚은 질량(kg/m), 𝑐𝑑 는 항력계수(kg/m), t는 시간(s)이다.
▪ 항력계수 𝑐𝑑 는 0.25kg/m로 가정할 때, 12초 후에 몸무게
가 68.1kg인 사람의 자유낙하 속도를 계산하는 스크립트
파일을 작성하고 실행 하시오.
▪ 답: 50.6175

5
3. MATLAB 프로그래밍 53/49

풀이
▪ 메뉴 선택(새 스크립트)으로 편집기를 연다. 특정 시각에
서 자유낙하 하는 사람의 속도를 계산하는 문장을 입력
후 파일 scriptdemo.m로 저장한다.
g = 9.81; m = 68.1 ; t = 12 ; cd = 0.25;
v = sqrt(g*m/cd) * tanh(sqrt(g*cd/m) * t)
▪ 명령창에서 다음과 같이 입력한다.
>>scriptdemo
▪ 명령창에서 각 라인을 입력했을 때처럼 스크립트는 실행
된 후 다음처럼 출력된다. >> g
v = g =
50.6175 9.81
▪ 스크립트 안의 변수(예, g)는 명령 작업 공간에 보존됨

6
3. MATLAB 프로그래밍 54/50

함수 파일(Function File)
▪ 함수 파일은 function으로 시작하는 M-파일로, 입력 인
수들을 받아들이고 출력들을 돌려 준다.
▪ 함수의 구문
function outvar = funcname(arglist)
% helpcomments
statements
outvar = value;
▪ 여기서 outvar는 출력 변수의 이름, funcname은 함수
이름, arglist는 함수의 인수 목록, helpcomments는 이
함수에 관한 정보를 사용자에게 제공하는 문장(help 등),
statements는 outvar에 배정될 value를 계산하는 문장.
▪ M-파일은 funcname.m으로 저장해야 하며, 명령 창에서
funcname을 입력하거나, 다른 함수에 호출 되여 실행

7
3. MATLAB 프로그래밍 54/50

예제 3.2 …
▪ 자유낙하 속도를 함수 파일을 사용하여 구하라.
freefall.m
function v = freefall(t, m, cd)
% freefall: bungee velocity with second-order drag
% v=freefall(t,m,cd) computes the free-fall velocity
% of an object with second-order drag
% input:
% t=time(s)
% m=mass(kg)
% cd=second order drag coefficient (kg/m)
% output:
% v=downward velocity (m/s)
g=9.81; % acceleration of gravity
v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t);
8
3. MATLAB 프로그래밍 55/51

예제 3.2 …
▪ 함수 파일의 장점은 다른 인수 값에 대하여 M-파일을 반
복적으로 불러낼 수 있다.
>> % 68.1 kg 인 사람의 12초 후의 속도?
>> freefall(12, 68.1, 0.25)
ans =
50.6175
>> % 100 kg 인 사람의 8초 후의 속도
>> freefall(8, 100, 0.25)
ans =
53.1878

9
3. MATLAB 프로그래밍 55

예제 3.2
▪ help 와 1ookfor 사용 예
>> help freefall
freefall: bungee velocity with second-order drag
v=freefall(t,m,cd) computes the free-fall velocity
of an object with second-order drag
input:
t=time(s)
m=mass(kg)
cd=second order drag coefficient (kg/m)
output:
v=downward velocity (m/s)
>> 1ookfor bungee
freefall.m - bungee velocity with second-order drag

10
3. MATLAB 프로그래밍 56/51

변수의 scope
▪ 명령 창과 스크립트 파일은 변수를 공유
▪ 함수에서 정의 된 변수는 지역 변수
▪ 이는 함수와 스크립트 사이의 중요한 차이이다.
▪ 예제 3.1의 끝에 다음과 같이 입력하면 값이 출력
>> g
g =
9.81
▪ 예제 3.2의 끝에 다음과 같이 입력하면 에러가 발생
>> g
'g'은(는) 정의되지 않은 함수 또는 변수입니다

11
3. MATLAB 프로그래밍 56/52

2개 이상의 결과를 반환하는 함수 파일


▪ 결과를 가지는 변수는 대괄호 안에 콤마로 구분
▪ e.g. 벡터의 평균과 표준편차의 계산하는 함수
stats.m 2
σ 𝑥 − 𝑥ҧ
function [mean, stdev] = stats(x)
n = length(x); 𝑛−1
mean = sum(x)/n;
stdev = sqrt(sum((x-mean).^2)/(n-1));
>> y = [8 5 10 12 6 7.5 4];
>> [m,s] = stats(y)
m =
7.5000
s =
2.8137
12
3. MATLAB 프로그래밍 57/52

부함수(subfunctions)
▪ 한 함수 파일에 여러 함수를 포함할 수 있다.
• 첫번째 함수는 주함수(primary function)이고, 나머지
함수는 부함수이다.
• 주함수의 이름과 함수 파일의 이름은 같아야 한다.
• 부함수는 같은 M-파일 내에서만 접근 가능하다.
freefallsubfunc.m
function v = freefallsubfunc(t, m, cd)
v = vel(t, m, cd);
end
function v = vel(t, m, cd)
g = 9.81;
v = sqrt(g * m / cd)*tanh(sqrt(g * cd / m) * t);
end

13
3. MATLAB 프로그래밍 | 3.2 입력-출력 57/53

입력-출력: input 함수
▪ prompt string을 화면에 보여주고, 키보드 입력을 대기
하며, 키보드 입력 값을 (평가 후) 반환한다.
n = input('promptstring')
▪ input 함수는 문자열을 받을 수도 있으며, 이를 위해서는
's' 를 함수의 인수 목록에 추가
>> m = input('Mass: ') >> m = input('Mass: ', 's')
Mass: 60 Mass: 60 – 10
m = m =
60 60 - 10
>> m = input('Mass: ')
Mass: 60 - 10
m =
50

14
3. MATLAB 프로그래밍 | 3.2 입력-출력 58/53

disp 함수
▪ 어떤 값을 화면에 손쉽게 출력
disp(value)
▪ 여기서 value 는 화면에 출력하고 싶은 값이다. 이 값으
로는 상수, 변수, 또는 문자열이 가능
>> disp(3)
3
>> disp(pi)
3.141592653589793
>> disp('Velocity (m/s): ')
Velocity (m/s):

15
3. MATLAB 프로그래밍 | 3.2 입력-출력 59/54

fprintf 함수
▪ 정보 출력을 제어하는 방법을 추가적으로 제공
fprintf('format', x, ...)
▪ 여기서 format 은 변수 x 값을 어떻게 출력할지를 규정
하는 문자열이다.
velocity = 50.6175;
>> fprintf('The velocity is %8.4f m/s\n', velocity)
The velocity is 50.6175 m/s
>> fprintf('%5d %10.3f %8.5e\n',100,2*pi,pi);
100 6.283 3.14159e+000

16
3. MATLAB 프로그래밍 59/55

fprintf 함수의 포맷 코드와 제어 코드


포맷 코드 설 명
%d 정수 포맷
%e e를 사용하는 과학 포맷
%E E를 사용하는 과학 포맷
%f 소수 포맷
%g %e나 %f 중에서 간단한 포맷
제어 코드 설 명
\n 새로운 줄로 시작
\t 탭

17
3. MATLAB 프로그래밍 60/55

fprintf 함수
▪ fprintf 함수는 벡터와 행렬을 출력할 수 있다.
fprintfdemo
function fprintfdemo >> fprintfdemo
x = [1 2 3 4 5]; x y
y = [20.4 12.6 17.8 88.7 120.4]; 1 20.400
z = [x;y]; 2 12.600
fprintf(' x y\n'); 3 17.800
fprintf('%3d %10.3f\n',z); 4 88.700
5 120.400
1
20.4
1 2 3 4 5
➔ 2
20.4 12.6 17.8 88.7 120.4 12.6
3
18
3. MATLAB 프로그래밍 60/56

3.2.1 파일의 생성과 접근


▪ MATLAB은 변수의 값을 save와 load를 위한 특별한 파일
형식인 MAT-파일이 있다.
▪ save filename var1 var2 ... varn
는 파일 filename.mat에 변수 var1 var2 ... varn를
저장한다. 생략하면 모든 변수를 저장한다.
▪ load filename var1 var2 ... varn
는 파일 filename.mat에서 변수 var1 var2 ... varn
를 불러온다. 생략하면 모든 변수를 불러온다.

19
3. MATLAB 프로그래밍 61/56

save와 load 사용 예
>> g=9.81;m=80;t=5;
>> cd=[.25 .267 .245 .28 .273]';
>> v=sqrt(g*m ./cd).*tanh(sqrt(g*cd/m)*t);
>> save veldrag v cd
>> clear % 작업공간에 있는 변수를 지움
>> v
??? Undefined function or variable 'v'.
>> load veldrag
>> who
Your variables are:
cd v

20
3. MATLAB 프로그래밍 61/56

변수 값을 텍스트 파일에 저장
▪ MATLAB에서 ASCII 파일은 save 명령어에 -ascii를 추가
하여 텍스트 파일을 만들 수 있다.
>> clear; aa = [ 5 7 9 2 ; 3 6 3 9 ] ;
>> save simpmatrix.txt aa –ascii % -double
▪ simpmatrix.txt 내용: 메모장 등으로 볼 수 있다:
5.0000000e+000 7.0000000e+000 9.0000000e+000 2.0000000e+000
3.0000000e+000 6.0000000e+000 3.0000000e+000 9.0000000e+000
▪ 파일 내용에 변수명이 없으므로 파일명을 변수명으로 함
>> load simpmatrix.txt
>> simpmatrix
simpmatrix =
5 7 9 2
3 6 3 9
21
3. MATLAB 프로그래밍 63/57

if 문
▪ 논리 조건이 참일 때 문장의 집합을 실행
if condition
statements
end
▪ 여기서 condition은 논리식으로 참 또는 거짓.
grader.m
function grader(grade)
% determines whether grade is passing
if grade >= 60
disp('passing grade') % 들여쓰기(Indentation)
end
>> grader(95.6)
passing grade
22
3. MATLAB 프로그래밍 63/58

error 함수
▪ 위치를 출력하고, 메시지 msg를 출력 후, M-파일을 끝내
고 명령 창으로 돌아간다.
error(msg)
errortest.m
function f = errortest(x)
if x == 0, error('zero value encountered'), end
f = 1/x;

>> errortest(10)
ans =
0.1000
>> errortest(0)
??? Error using ==> errortest at 2
zero value encountered
23
3. MATLAB 프로그래밍 64/59

관계식 및 관계 연산자(Relational Operators)


▪ 두 값을 비교하여 결과가 참과 거짓을 관계식
value1 relation value2
▪ 여기서 value*는 상수, 변수, 또는 식이 될 수 있으며,
relation은 다음 관계 연산자 중 하나이다.
예 연산자 관계
x == 0 == Equal
unit ~= 'm' ~= Not equal
a < 0 < Less than
s > t > Greater than
3.9 <= a/3 <= Less than or equal to
r >= 0 >= Greater than or equal to

24
3. MATLAB 프로그래밍 64/59

논리 연산자(Logical operator)
▪ false: 0, empty string
▪ true: nonzero, nonempty string
구문 의미 설명
~x Not true if x is false; false otherwise
x & y And true if both x and y are true
x | y Or true if either x or y are true
x && y 쇼트서킷 and y is not evaluated if x is false
x || y 쇼트서킷 or y is not evaluated if x is true

▪ 연산자의 우선 순위는 ~ < & | && || 순이다.

25
3. MATLAB 프로그래밍 66/60

if ... else 문
▪ 논리조건이 참이면 첫 번째 문장을, 거짓이면 두 번째 문
장을 수행한다.
if condition
>> a=[2 3 5];
statements1
>> i=0;
else
>> i > 0 & a(i)
statements2
첨자 인덱스는 양의정수…
end
>> i > 0 && a(i)
>> if i > 0 & a(i), end

26
3. MATLAB 프로그래밍 66/60

if ... elseif 문
▪ if... else 문에서 거짓인 경우에 대해 또 다른 판정이
필요할 때 사용된다. 이 형태는 3 개 이상의 옵션을 가질
때 나타난다.
if condition1
statements1
elseif condition2
statements2
elseif condition3
statements3

else
statementselse
end

27
3. MATLAB 프로그래밍 67/61

예제 3.4 mysign 구현
▪ 스칼라에 대하여 MATLAB의 내장함수 sign은 인수의 부
호에 따라 (−1, 0, 1)의 값을 넘겨준다. 같은 기능을 수행
하는 M-파일을 개발하시오.
>> sign (25.6)
ans =
1
>> sign(-0.776)
ans =
-1
>> sign(0)
ans =
0

28
3. MATLAB 프로그래밍 67/62

풀이
mysign.m
function sgn = mysign(x)
% mysign(x) returns 1 if x is greater than zero.
% -1 if x is less than zero.
% 0 if x is equal to zero.
if x > 0 >> mysign (25.6)
sgn = 1; ans =
elseif x < 0 1
sgn = -1; >> mysign(-0.776)
else ans =
sgn = 0; -1
end >> mysign(0)
ans =
0

29
3. MATLAB 프로그래밍 68/63

switch 문
▪ 검증식의 값에 따라 해당 블록의 코드가 수행된다. 지정
된 값에 해당되지 않으면 otherwise 블록이 실행된다.
switch testexpression grade = 'B';
case value1 switch grade
statements1 case 'A'
case value2 disp('Excellent')
statements2 case 'B'
⋮ disp('Good')
otherwise case 'C'
statementsotherwise disp('Mediocre’)
end otherwise
disp('Huh!')
end

30
3. MATLAB 프로그래밍 69/63

변동 인수 목록(Variable Argument List)


▪ 함수 nargin로 입력 인수의 수를 알 수 있고,이 것으로
기본값을 함수에 구현이 가능
▪ 기본값(default value)은 함수에 인수 값을 전달하지 않는
경우 자동적으로 배정되는 값이다.
▪ e.g., linspace(xl, x2, n)는 n개의 점을 생성하고,
n을 생략하면 100개의 점을 생성한다.
mylinspace.m
function x = mylinspace(x1, x2, n)
if nargin == 2, n = 100; end
disp(nargin) >> mylinspace(10,20,90)
end 3
>> mylinspace(10,20)
2

31
3. MATLAB 프로그래밍 70/65

3.3.2 루프(loop, 반복)


▪ 이름이 의미하는 것처럼 루프는 반복적으로 작업을 수행
하는 것이다.
▪ 반복을 끝내는 방법에 따라 두 종류가 있다.
• for 루프는 지정된 횟수만큼 반복한 후 끝낸다.
• while 루프는 논리조건을 기초로 하여 끝낸다.

32
3. MATLAB 프로그래밍 70/65

for ... end 문


▪ for 루프는 정해진 횟수만큼 문장을 반복한다.
for index = start:step:finish
statements
end
또는
for index = start:finish % step이 1일 때
statements
end
▪ 여기서 변수 index 는 콜론 연산자에 의해 생성되는 벡
터에 있는 값을 연속적으로 가진다.

33
3. MATLAB 프로그래밍 71/65

예제 3.5 팩토리얼 계산
factor.m
function fout = factor(n)
% factor(n):
% Computes the product of all the integers from 1 to n.
x = 1;
for i = 1:n
x = x * i;
end
fout = x; >>> factor(5)
end ans =
120

34
3. MATLAB 프로그래밍 72/66

벡터화
▪ for 루프가 MATLAB에서 특정한 횟수에 대해 문장을 반
복하기 위한 가장 효과적인 방법이 아닐 수도 있다.
▪ MATLAB은 배열에 직접 연산하는 능력을 가지고 있으므
로 벡터화가 더욱 효과적일 수 있다.
for loop Vectorization
i = 0; t = 0:0.02:50;
for t = 0:0.02:50 y = cos(t);
i = i + 1;
y(i) = cos(t);
end

35
3. MATLAB 프로그래밍 72/66

메모리의 사전할당
▪ MATLAB은 새로운 원소를 추가할 때마다 배열의 크기를
자동적으로 증가시킨다. 반복적으로 원소를 추가하면 시
간이 많이 소요될 수 있다.
▪ 메모리를 사전 할당하여 프로그램의 효율을 향상시킨다.
t = 0:.01:5; t = 0:.01:5;
for i = 1:length(t) y = ones(size(t));
if t(i)>1 for i = 1:length(t)
y(i) = 1/t(i); if t(i)>1
else y(i) = 1/t(i);
y(i) = 1; end
end end
end

36
3. MATLAB 프로그래밍 73/67

while 문
▪ while 루프는 논리조건이 참인 동안 만 반복
while condition
statements
end
▪ while과 end 사이의 문장은 조건이 참인 동안에만 반복
된다.
▪ break 문을 실행하게 되면 루프를 끝낸다.
test.m
x = 8; >> test
while x > 0 5
x = x - 3; 2
disp(x) -1
end

37
3. MATLAB 프로그래밍 74/67

while … break
▪ 루프 안의 어디서든지 조건이 참이면 루프가 끝내는
구조
while (1)
statements
if condition, break, end
statements
end
test.m
x = 8
while (1)
x = x - 5;
if x < 0, break, end
end
38
3. MATLAB 프로그래밍 74/68

pause 명령어
▪ pause 명령어는 아무 키를 입력할 때까지 기다리게 한다.
▪ pause(n)은 n초 동안 순서를 멈추고 싶을 경우에 사용
▪ beep는 컴퓨터가 삑하는 소리를 내게 하는 명령이다.
▪ tic 과 toc 은 경과시간을 측정하기 위해 함께 사용한다.
▪ Ctrl+C, 또는 Ctrl+Break: 프로그램을 강제로 종료
• 명령 창으로 focus를 이동해야 함
test.m
tic
beep >> test
pause(5) 경과 시간은 5.014589초입니다.
beep
toc

39
3. MATLAB 프로그래밍 81/74

익명 함수(Anonymous Functions)
▪ 익명함수는 M-파일을 만들지 않고도 간단한 함수를 생성
할 수 있게 한다.
fhandle = @(arglist) expression
▪ 여기서 fhandle은 함수를 불러내는 함수 처리기(function
handle), arglist는 함수에 전달되는 입력인수의 목록인데
콤마로 분리된다. 그리고 expression은 하나의 유효한
MATLAB 식이다.
>> f1=@(x,y) x^2 + y^2 f1.m
>> f1(3,4) function s = f1(x,y)
ans = s = x^2 + y^2;
25 end

40
3. MATLAB 프로그래밍 81/74

익명 함수에서 인수 외의 변수 사용
▪ 익명함수는 인수 목록 내의 변수들 외에 그 함수가 만들
어진 작업공간 내에 존재하는 변수들을 포함할 수 있다.
▪ 함수 처리기는 그것이 만들어 졌을 때의 함수의 스냅샷
을 유지한다. 변수가 새로운 값이 되면 익명함수를 다시
만들어야 한다.
>> a = 4;
>> f2 = @(x) a * x ^ 2
>> f2(3)
ans =
36
>> a = 3;
>> f2(3)
ans =
36
41
3. MATLAB 프로그래밍 82/75

함수를 다른 함수의 인수로 전달


▪ 범용적인 함수를 설계하고 그 함수의 인수로 처리를 원
하는 함수를 전달
funcavg.m
function favg = funcavg(f,a,b,n)
x = linspace(a,b,n);
y = f(x);
favg = mean(y);

>> m=68.1; cd=0.25;


>> v = @(t) sqrt(9.81*cd/m)*t;
>> funcavg(v, 0, 10, 100) % function handle
ans = 0.948857416304353
>> funcavg(@sin, 0, 2*pi, 180) % 함수명 앞에 @
ans = -6.300122617876182e-17
42
3. MATLAB 프로그래밍 85/78

인수의 전달
▪ 인수로 전달된 함수의 인수 개수가 다를 수 있다.
▪ varargin 로 가변적 개수의 인수를 전달할 수 있다.
funcavg.m
function favg = funcavg(f,a,b,n,varargin)
x = linspace(a,b,n);
y = f(x,varargin{:});
favg = mean(y);
>> v = @(t,m,cd) sqrt(9.81*cd/m)*t;
>> funcavg(v, 0, 10, 100, 68.1, 0.25);
>> funcavg(@sin, 0, 2*pi, 180)
ans = -6.300122617876182e-17

43

You might also like