You are on page 1of 38

MATLAB Programming

M-file 작성시 유용한 함수들

김탁은
kmste2@kaist.ac.kr

1
MATLAB Programming

input 함수
 사용자의 입력을 기다리는 함수

• r = input( prompt )
– prompt 문자열을 화면에 출력하고 사용자의 입력을 기다림
– 사용자가 입력한 문자열을 evaluation 하고, 그 결과를 r 값으로 반환
– 사용자의 입력에 나타난 변수는 workspace에 미리 선언되어 있어야 함
>> x = 5;
>> r = input('변수명 이나 수식을 입력하세요 : ') >> r = input('변수명 이나 수식을 입력하세요 : ')
변수명 이나 수식을 입력하세요 : sin(x^2) 변수명 이나 수식을 입력하세요 : my_triu( magic(4), 1 )

r= r=
-0.1324
0 2 3 13
>> r = input('변수 이름이나 수식을 입력하세요. : ') 0 0 10 8
변수 이름이나 수식을 입력하세요. : y 0 0 0 12
Error using input 0 0 0 0
Undefined function or variable 'y'.

>> s = struct('name', '홍길동', 'age', 30); >> r = input('변수명 이나 수식을 입력하세요 : ')
>> r = input('변수명 이나 수식을 입력하세요 : ') 변수명 이나 수식을 입력하세요 : 'hello world'
변수명 이나 수식을 입력하세요 : s.name
r=
r=
홍길동 hello world
2
MATLAB Programming

input 함수
• str = input( prompt , ‘s’ )
– prompt 문자열을 출력하고 사용자의 입력을 기다림
– 사용자의 입력을 평가 (evaluation) 하지 않고, 문자열로 반환

>> reply = input( 'Do you want more? Y/N [Y]:', 's‘ );
>> str = input( '아무 문자나 입력하세요 : ', 's')
>> if isempty(reply), reply = 'Y'; end
아무 문자나 입력하세요 : 안녕하세요
>> reply
str =
reply =
안녕하세요
Y

3
MATLAB Programming

Input Dialog

 inputdlg 함수
• GUI 다이얼로그 박스로부터 사용자의 입력을 받음
• v = inputdlg( prompt, dialog_title, num_lines, default_values )
• v : 사용자가 입력한 값을 cell로 리턴함

>> answer = inputdlg('Enter matrix size:', 'Input', 1, {'20'})

answer =
'20‘

>> v = str2num( answer{1} )


선택한 버튼
v=
20

4
MATLAB Programming

Input Dialog

 여러 질문을 동시에 입력 받으려면


• prompt 값을 cell 배열로 설정
prompt = {'Enter matrix size:', 'Enter colormap name:'};
dlg_title = 'Input';
num_lines = 1;
def = {'20','hsv'};
answer = inputdlg(prompt,dlg_title,num_lines,def)

answer =
'20'
'hsv'
>> class(answer) 선택한 버튼
ans =
cell

5
MATLAB Programming

Input Dialog

 텍스트 입력 창의 크기 조절
• prompt 부분의 값을 cell 배열로 설정

x = inputdlg( {'Name', 'Telephone', 'Account'}, 'Customer', [1 50; 1 12; 1 7] )

6
MATLAB Programming

menu 함수
 menu window를 생성

• r = menu( 메뉴 타이틀, 버튼 레이블 1, 버튼 레이블 2, … )


– 선택한 버튼의 인덱스를 반환

>> r = menu( '버튼을 선택하세요', '버튼 1', '버튼 2', '버튼 3' )

r=
선택한 버튼
2

% menu_test.m

t = -2*pi:0.01:2*pi;
y = sin(t);
colors = ['r', 'g', 'b'];
k = menu( ‘선 색을 정하세요', 'red', 'green', 'blue' );
plot(t, y, colors(k));

7
MATLAB Programming

Quiz

 다음과 같이 menu window에 함수들의 목록이 나타나고, 사용자가


임의의 함수를 선택하면 x값을 입력 받아 선택한 함수의 값을 계산하는
함수 M-file을 작성해보자.

8
MATLAB Programming

Quiz Sol.
 다음과 같이 menu window에 함수들의 목록이 나타나고, 사용자가 임의의 함수를 선택하면 x값을 입력
받아 선택한 함수의 값을 계산하는 함수 M-file을 작성해보자.

9
MATLAB Programming

dialog 함수들
 questdlg : 질문형 dialog box
• r = questdlg( 메시지, 타이틀, 버튼1, 버튼2, 기본선택버튼 )

>> str = questdlg( '계속 하시겠습니까?', '질문', 'Yes', 'No', 'No' )

str =

No 선택한 버튼

 msgbox : 일반적인 메세지 dialog box


• r = msgbox( 메시지, 타이틀, 아이콘 )
– 아이콘: ‘none’, ‘error’, ‘help’, ‘warn’

10
MATLAB Programming

waitbar 함수
 진행 상태를 표시하는 dialog를 생성

• h = waitbar( 0~1사이 값, 메시지 )

h = waitbar( 0, ‘Please wait…’ );


for i = 1:1000
% computation here
waitbar( i/1000, h );
end

11
MATLAB Programming

error, warning 함수
 error( 메시지 )
• 메시지를 출력하고 함수로부터 빠져 나오거나 (함수 M-file 내에 사용된 경우) 프로그램 실행 중단
(스크립트 M-file 에서 사용된 경우)

 warning( 메시지 )
• 메시지를 출력하여 사용자에게 비정상적인 조건이 발생했음을 경고
• error 함수처럼 프로그램의 실행을 중단하지는 않음

12
MATLAB Programming

dir 함수
 지정한 디렉토리에 위치한 파일들의 목록을 구조체 배열로 반환

• d = dir( 디렉토리 )
– 생략시 Current Directory의 파일들을 나열
– 읽어야 할 데이터 파일이 특정 디렉토리 밑에 여러 파일로 나뉘어 저장되어 있는
경우, 모든 데이터 파일들을 읽어오고자 할 때 사용

>> files = dir( ‘C:\’ );

files =

23x1 struct array with fields:

name
date
bytes
isdir
datenum

13
MATLAB Programming

List Dialog

 listdlg 함수
• 데이터를 목록으로 보여주고, 사용자가 해당 목록의 특정 아이템을 선택하게
하는 GUI 다이얼로그 박스

• [selection, ok] = listdlg( 'ListString',S )


• ListString : 목록에 나타날 아이템(문자열)들의 cell array

• selection : 사용자가 입력한 값이 ListString 몇번째에 위치한


아이템인지 인덱스 값

• ok : 선택하면 1, 선택하지 않으면 0

d = dir;
str = {d.name};
[s,v] = listdlg('PromptString','Select a file:',...
'SelectionMode','single',...
'ListString',str)

선택한 버튼 14
MATLAB Programming

List Dialog

 여러 아이템을 동시에 선택하려면

d = dir;
str = {d.name};
[s,v] = listdlg('PromptString','Select a file:',...
'SelectionMode', ‘mutiple',...
'ListString',str)

s=
3 7 10

v=
1
선택한 버튼

15
MATLAB Programming

관계 연산자
 참값, 거짓값

>> a = true >> b = false

a= b=
1 0

 관계 연산자 종류

연산자 의미
== 대등
~= 같지 않음
< 작은
> 큰
<= 작거나 같은
>= 크거나 같은

16
MATLAB Programming

논리 is* 함수들
 입력된 값들이 테스트에 통과하면 true, 실패하면 false를 리턴하는 함수들
논리 is* 함수 기능
ischar 문자열인지 테스트
>> ischar( ‘hello world’ ) >> islogical( [true 1 false] )
isempty 빈 배열(empty array)인지 테스트 >> ischar( 1 )
>> isnan( [1 nan 2] )
isequal 두 배열이 서로 동일한지 테스트 >> isempty( [] )
isfinite Inf가 아닌 배열 원소들 검지 >> isempty( [1 2] ) >> isnumeric( 1.323 )
>> isnumeric( ‘hello’ )
isfloat 부동 소수점 배열(single, double)인지 테스트 >> isequal( [1 2], [1 2] )
>> isequal( [1 2], [3 4 5] ) >> isreal( 1.32 )
isinf Inf인 배열 원소들 검지 >> isreal( 1+2i )
isinteger 정수 배열인지 테스트 >> isfinite( [1 Inf 3] )
>> isscalar( 1 )
islogical 논리 배열인지 테스트 >> isfloat( 1 ) >> isscalar( [1 2 3] )
>> isfloat( int8(1) )
isnan NaN 배열 원소들을 검지
>> issorted( [1 2 3] )
isnumeric 수치 배열 (정수, 부동 소수점)인지 테스트 >> isinf( [1 Inf 3] ) >> issorted( [3 1 2] )

isreal 실수 배열인지 테스트 >> isinteger( int8(1) ) >> isvector( [1 2 3] )


>> isinteger( 1.1 ) >> isvector( magic(3) )
isscalar 스칼라 배열인지 테스트
issorted 정렬된 벡터인지 테스트
isvector 벡터 배열인지 테스트
iscolumn 열 벡터인지 테스트

17
MATLAB Programming

논리 is* 함수 활용 예

 함수 M-file에서 입력 매개변수가 정확하게 들어왔는지 확인할 때


요긴하게 사용할 수 있음
• 예를 들어, 두 벡터의 유클리드 거리를 계산하는 함수의 경우, 입력
매개변수가 벡터가 맞는지 검사하고, 만약 아니면 에러를 출력

% euc_dist.m

function [y] = euc_dist ( v1, v2 )

if ~isvector(v1) || ~isvector(v2)
error(‘벡터가 아닙니다.’);
end

y = sqrt( sum( (v1-v2).^2 ) );

end

18
MATLAB Programming

Quiz
 지난 시간에 두 벡터를 입력 받아 두 벡터의 유클리드 거리를
계산해주는 함수 my_eucdist 를 작성해보았다.
• 입력으로 들어오는 값은 벡터가 아닐 수도 있고, 두 벡터의 길이가 다를 수도
있으며, 두 벡터 모두 행 벡터 또는 열 벡터로 정렬되지 않을 수도 있다.
• 예를 들면, 아래와 같이 v1, v2 벡터가 입력될 수 있다.
>> v1 = [1 4 5 2] >> v1 = [1 4 5 2] >> v1 = [1 4 5 2] >> v1 = [1 4 5 2]
>> v2 = [5 3 2 5] >> v2 = [5 3 2 5] >> v2 = [5 3 2 5 2 7 9] >> v2 = {‘hello’, 3}
>> my_eucdist( v1, v2 ) >> my_eucdist( v1, v2’ ) >> my_eucdist( v1, v2 ) >> my_eucdist( v1, v2 )

• 입력 매개변수를 검사하는 안전한 함수 M-file을 작성해 보자. 잘못된 입력이


들어올 시, 에러 메시지를 출력하자. (error 함수 사용)
• 두 벡터의 방향이 정렬되지 않은 채 입력으로 들어올 경우에는, 두 벡터의
방향이 서로 다르더라도 에러를 내지 않고 유클리드 거리를 계산해주자. (이
때, try-catch 문을 사용하지 말고, iscolumn 함수를 사용하자)

19
MATLAB Programming

Quiz Sol.
 지난 시간에 두 벡터를 입력 받아 두 벡터의 유클리드 거리를 계산해주는 함수
my_eucdist 를 작성해보았다. 입력 매개변수를 검사하는 안전한 함수 M-file을
작성해 보자.
function [ dist ] = my_eucdist( v1, v2 )

if ~isvector(v1) || ~isvector(v2)
error('입력값이 벡터가 아닙니다.');
end >> v1 = [1 4 5 2]
>> v2 = [5 3 2 5 2 7 9]
if ~isnumeric(v1) || ~isnumeric(v2) >> my_eucdist( v1, v2 )
error('입력값이 벡터가 아닙니다.');
end Error using my_eucdist (line 8)
두 벡터의 길이가 서로 다릅니다.
if length(v1) ~= length(v2)
error('두 벡터의 길이가 서로 다릅니다.');
end >> v2 = {'hello', 3}
>> my_eucdist( v1, v2)
if iscolumn(v1) ~= iscolumn(v2)
v1 = v1'; Error using my_eucdist (line 8)
end
입력값이 벡터가 아닙니다.
dist = sqrt( sum( (v1-v2).^2 ) );

end 20
MATLAB Programming

sort 함수
 배열 X를 정렬하는 함수

• Y = sort(X, 차원 인덱스, 정렬 모드)


– 배열 X를 “차원 인덱스“ 방향으로 “정렬 모드” (오름차순/내림차순) 에 맞게 정렬
– 차원 인덱스 생략시 기본값 1, 정렬 모드 생략시 기본 값 ‘ascend’

>> Y = sort(M, 1, 'ascend') >> Y = sort(M, 2, 'ascend')

Y= 정렬 방향 Y=

>> M = randi(100,3,5) 45 28 17 12 23 12 35 49 68 71
49 71 66 50 35 45 50 59 66 76
M= 65 76 68 96 59 17 23 28 65 96

49 71 68 12 35 >> Y = sort(M, 1, 'descend') >> Y = sort(M, 2, 'descend')


45 76 66 50 59
65 28 17 96 23 Y= Y=

65 76 68 96 59 71 68 49 35 12
49 71 66 50 35 76 66 59 50 45
45 28 17 12 23 96 65 28 23 17

21
MATLAB Programming

sort 함수
 배열 X를 정렬하는 함수

• [Y, I] = sort(X, 차원 인덱스, 정렬 모드)


– 정렬된 배열(Y)과, 정렬 순서(I)를 함께 반환

>> [Y,I] = sort(M, 1, 'ascend') >> [Y,I] = sort(M, 2, 'ascend')

Y= 정렬 방향 Y=
>> M = randi(100,3,5)
45 28 17 12 23 12 35 49 68 71
49 71 66 50 35 45 50 59 66 76
M=
65 76 68 96 59 17 23 28 65 96
49 71 68 12 35
45 76 66 50 59
I= I=
65 28 17 96 23
2 3 3 1 3 4 5 1 3 2
1 1 2 2 1 1 4 5 3 2
3 2 1 3 2 3 5 2 1 4

22
MATLAB Programming

sortrows 함수
 행렬 X에서 특정 열 값을 기준으로 행 단위로 정렬하는 함수

• [Y, I] = sortrows(X, 정렬할 열 인덱스)


– 정렬된 행렬(Y)과, 정렬 순서(I)를 함께 반환

>> [Y, I] = sortrows(M, 2) >> [Y, I] = sortrows(M, 5)

Y = 정렬 대상 열 Y= 정렬 대상 열
>> M = randi(100,3,5)
65 28 17 96 23 65 28 17 96 23
49 71 68 12 35 49 71 68 12 35
M=
45 76 66 50 59 45 76 66 50 59
49 71 68 12 35
45 76 66 50 59
I= I=
65 28 17 96 23
3 3
1 1
2 2

23
MATLAB Programming

데이터 시각화: 그래프

김탁은
kmste2@kaist.ac.kr

24
MATLAB Programming

MATLAB에서 지원하는 그래프


 PLOTS 탭

25
MATLAB Programming

MATLAB에서 지원하는 그래프

26
MATLAB Programming

2차원 그래프 그려보기

x = -pi:0.1:pi;
y1 = sin(x);
y2 = cos(x);
plot( x, y1, ‘o’, x, y2, ‘:’ );

27
MATLAB Programming

Figure 창 컨트롤

그래프
회전
그래프 범례
그래프 그래프 포커스 표시
저장 확대 및 축소 이동

28
MATLAB Programming

MATLAB의 2D Plotting 원리
 X 값과 Y 값이 아래와 같이 길이가 n인 벡터로 주어졌다고 가정

• 𝑋𝑋 = 𝑥𝑥1 , 𝑥𝑥2 , … , 𝑥𝑥𝑛𝑛


• 𝑌𝑌 = 𝑦𝑦1 , 𝑦𝑦2 , … , 𝑦𝑦𝑛𝑛

 MATLAB에서 그래프를 그리는 방법은

• 1. 동일한 인덱스를 가지는 𝑥𝑥𝑘𝑘 , 𝑦𝑦𝑘𝑘 값에 대해 𝑥𝑥𝑘𝑘 , 𝑦𝑦𝑘𝑘 값을 좌표로 하여 점을 찍음


• 2. 모든 𝑥𝑥𝑘𝑘 , 𝑦𝑦𝑘𝑘 점에 대해, 인접한 점 𝑥𝑥𝑘𝑘−1 , 𝑦𝑦𝑘𝑘−1 와 𝑥𝑥𝑘𝑘+1 , 𝑦𝑦𝑘𝑘+1 을 선으로 연결

29
MATLAB Programming

MATLAB의 2D Plotting 원리
 X=0..pi 범위에서 sin(X) 를 그린다고 하면, X 와 Y 벡터를 아래와 같이 생성

• 𝑋𝑋 = 0, 0.1, 0.2, … , 𝑝𝑝𝑝𝑝 두 벡터는 동일한 길이를 가지도록 생성


• 𝑌𝑌 = sin 0 , sin 0.1 , sin 0.2 , … , sin 𝑝𝑝𝑝𝑝

 MATLAB에서 plot(x, y) 수행 시,

• 1. 동일한 인덱스를 가지는 𝑥𝑥𝑘𝑘 , 𝑦𝑦𝑘𝑘 값에 대해 𝑥𝑥𝑘𝑘 , 𝑦𝑦𝑘𝑘 ≔ 𝑥𝑥𝑘𝑘 , sin 𝑥𝑥𝑘𝑘 값을 좌표로 하여
점을 찍음
• 2. 모든 𝑥𝑥𝑘𝑘 , 𝑦𝑦𝑘𝑘 점에 대해, 인접한 점 𝑥𝑥𝑘𝑘+1 , 𝑦𝑦𝑘𝑘+1 을 선으로 연결

x 값이 촘촘할 수록
더 정확한 모양의
그래프가 그려짐!!

30
MATLAB Programming

MATLAB의 2D Plotting 원리
 벡터 X의 원소 개수 (x축 분할 개수)에 따른 그래프의 변화

x = linspace(-2,2,500);
y = exp(x) .* sin(1./x);
plot(x,y)

x = linspace(-2,2,100);
y = exp(x) .* sin(1./x);
plot(x,y)

31
MATLAB Programming

그래프 곡선 속성

x = -pi:0.1:pi;
y1 = sin(x);
y2 = cos(x);
plot( x, y1, ‘o’, x, y2, ‘:’ );

32
MATLAB Programming

그래프 곡선 속성
 곡선의 선 모양, 색상, 기호 등을 각기 다르게 표현 가능
• 각 속성들을 조합해서 그래프 드로잉
곡선 속성 기호 의미 곡선 속성 기호 의미
. 점 b 파란색
x x표 r 빨강색
o 원 g 녹색
+ 플러스 기호 c 청록색
색종류
* 별표 m 자홍색
s 정방형 y 노란색
기호 d 다이아몬드 w 흰색
v 삼각형 (위쪽) k 검은색
^ 삼각형 (아래쪽)
곡선 속성 기호 의미
< 삼각형 (왼쪽)
- 실선
> 삼각형 (오른쪽)
: 점선
p 오각형 선모양
-. 반점선
h 육각형
-- 긴점선

33
MATLAB Programming

그래프 곡선 속성
 실습: 그래프 곡선 속성들을 다양하게 조합하여 그래프를 그려보자

>> plot(-2:0.1:2, sin(-2:0.1:2), 'k<:')


>> plot(-2:0.1:2, sin(-2:0.1:2), 'rp-.')
>> plot(-2:0.1:2, sin(-2:0.1:2), 'b-.')

34
MATLAB Programming

격자, 라벨, 범례 x = 0:0.1:2*pi;


y = sin(x);
z = exp(-x).*cos(x);
 격자 plot(x, y, x, z, ':');
• grid on, grid off grid on;
xlabel('x value');
ylabel('y value');
 축 라벨
legend( 'sin(x)', 'exp(-x)*cos(x)', -1);
• x축: xlabel( 문자열 )
• y축: ylabel( 문자열 )

 범례
• legend( 문자열, 문자열, 범례위치 )

35
MATLAB Programming

범례(legend)의 위치
옵션 범례의 위치
0 데이터와 겹치지 않는 최적 위치
1 축의 오른쪽 위 모서리
2 축의 왼쪽 위 모서리
3 축의 왼쪽 아래 모서리
4 축의 오른쪽 아래 모서리
-1 그래프의 오른쪽

36
MATLAB Programming

축(axis) 속성
 axis tight 또는 axis(‘tight’)

x = 0:0.1:2*pi;
y = cos(x);
plot(x,y);

>> axis tight

37
MATLAB Programming

축(axis) 속성
 axis( [xmin xmax ymin ymax] )

>> axis( [-1 7 -1.2 1.2] )

axis 명령어 옵션 의미
axis auto 기본 축 한계로 되돌아감
axis equal x, y, z 축 상의 데이터 단위를 동일화
axis off 축을 제거
axis square 축 박스를 정사각형으로 설정
xlim( [xmin xmax] ) x축 한계를 설정
ylim( [ymin ymax] ) y축 한계를 설정

38

You might also like