Professional Documents
Culture Documents
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
3. MATLAB 프로그래밍 53/49
4
3. MATLAB 프로그래밍 53/49
예제 3.1: 스크립트 파일
▪ 자유낙하 하는 사람의 속도는 다음과 같다.
𝑔𝑚 𝑔𝑐𝑑
𝑣 𝑡 = tanh 𝑡
𝑐𝑑 𝑚
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
부함수(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
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
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
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
31
3. MATLAB 프로그래밍 70/65
32
3. MATLAB 프로그래밍 70/65
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
인수의 전달
▪ 인수로 전달된 함수의 인수 개수가 다를 수 있다.
▪ 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