M-file 작성시유용한함수들 김탁은 kmste2@kaist.ac.kr 1
input 함수 사용자의입력을기다리는함수 r = input( prompt ) prompt 문자열을화면에출력하고사용자의입력을기다림 사용자가입력한문자열을 evaluation 하고, 그결과를 r 값으로반환 사용자의입력에나타난변수는 workspace 에미리선언되어있어야함 >> x = 5; >> r = input(' 변수명이나수식을입력하세요 : ') 변수명이나수식을입력하세요 : sin(x^2) r = -0.1324 >> r = input(' 변수이름이나수식을입력하세요. : ') 변수이름이나수식을입력하세요. : y Error using input Undefined function or variable 'y'. >> r = input(' 변수명이나수식을입력하세요 : ') 변수명이나수식을입력하세요 : my_triu( magic(4), 1 ) r = 0 2 3 13 0 0 10 8 0 0 0 12 0 0 0 0 >> s = struct('name', ' 홍길동 ', 'age', 30); >> r = input(' 변수명이나수식을입력하세요 : ') 변수명이나수식을입력하세요 : s.name r = 홍길동 >> r = input(' 변수명이나수식을입력하세요 : ') 변수명이나수식을입력하세요 : 'hello world' r = hello world 2
input 함수 str = input( prompt, s ) prompt 문자열을출력하고사용자의입력을기다림 사용자의입력을평가 (evaluation) 하지않고, 문자열로반환 >> reply = input( 'Do you want more? Y/N [Y]:', 's ); >> if isempty(reply), reply = 'Y'; end >> reply reply = Y >> str = input( ' 아무문자나입력하세요 : ', 's') 아무문자나입력하세요 : 안녕하세요 str = 안녕하세요 3
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
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
Input Dialog 텍스트입력창의크기조절 prompt 부분의값을 cell 배열로설정 x = inputdlg( {'Name', 'Telephone', 'Account'}, 'Customer', [1 50; 1 12; 1 7] ) 6
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
Quiz 다음과같이 menu window 에함수들의목록이나타나고, 사용자가 임의의함수를선택하면 x 값을입력받아선택한함수의값을계산하는 함수 M-file 을작성해보자. 8
Quiz Sol. 다음과같이 menu window 에함수들의목록이나타나고, 사용자가임의의함수를선택하면 x 값을입력 받아선택한함수의값을계산하는함수 M-file 을작성해보자. 9
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
waitbar 함수 진행상태를표시하는 dialog 를생성 h = waitbar( 0~1 사이값, 메시지 ) h = waitbar( 0, Please wait ); for i = 1:1000 % computation here waitbar( i/1000, h ); end 11
error, warning 함수 error( 메시지 ) 메시지를출력하고함수로부터빠져나오거나 ( 함수 M-file 내에사용된경우 ) 프로그램실행중단 ( 스크립트 M-file 에서사용된경우 ) warning( 메시지 ) 메시지를출력하여사용자에게비정상적인조건이발생했음을경고 error 함수처럼프로그램의실행을중단하지는않음 12
dir 함수 지정한디렉토리에위치한파일들의목록을구조체배열로반환 d = dir( 디렉토리 ) 생략시 Current Directory 의파일들을나열 읽어야할데이터파일이특정디렉토리밑에여러파일로나뉘어저장되어있는경우, 모든데이터파일들을읽어오고자할때사용 >> files = dir( C:\ ); files = 23x1 struct array with fields: name date bytes isdir datenum 13
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
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
관계연산자 참값, 거짓값 >> a = true a = 1 >> b = false b = 0 관계연산자종류 연산자 의미 == 대등 ~= 같지않음 < 작은 > 큰 <= 작거나같은 >= 크거나같은 16
논리 is* 함수들 입력된값들이테스트에통과하면 true, 실패하면 false 를리턴하는함수들 논리 is* 함수 기능 ischar isempty isequal isfinite isfloat isinf isinteger islogical isnan isnumeric 문자열인지테스트빈배열 (empty array) 인지테스트두배열이서로동일한지테스트 Inf가아닌배열원소들검지부동소수점배열 (single, double) 인지테스트 Inf인배열원소들검지정수배열인지테스트논리배열인지테스트 NaN 배열원소들을검지수치배열 ( 정수, 부동소수점 ) 인지테스트 >> ischar( hello world ) >> ischar( 1 ) >> isempty( [] ) >> isempty( [1 2] ) >> isequal( [1 2], [1 2] ) >> isequal( [1 2], [3 4 5] ) >> isfinite( [1 Inf 3] ) >> isfloat( 1 ) >> isfloat( int8(1) ) >> isinf( [1 Inf 3] ) >> islogical( [true 1 false] ) >> isnan( [1 nan 2] ) >> isnumeric( 1.323 ) >> isnumeric( hello ) >> isreal( 1.32 ) >> isreal( 1+2i ) >> isscalar( 1 ) >> isscalar( [1 2 3] ) >> issorted( [1 2 3] ) >> issorted( [3 1 2] ) isreal isscalar 실수배열인지테스트스칼라배열인지테스트 >> isinteger( int8(1) ) >> isinteger( 1.1 ) >> isvector( [1 2 3] ) >> isvector( magic(3) ) issorted 정렬된벡터인지테스트 isvector 벡터배열인지테스트 iscolumn 열벡터인지테스트 17
논리 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
Quiz 지난시간에두벡터를입력받아두벡터의유클리드거리를계산해주는함수 my_eucdist 를작성해보았다. 입력으로들어오는값은벡터가아닐수도있고, 두벡터의길이가다를수도있으며, 두벡터모두행벡터또는열벡터로정렬되지않을수도있다. 예를들면, 아래와같이 v1, v2 벡터가입력될수있다. >> v1 = [1 4 5 2] >> v2 = [5 3 2 5] >> my_eucdist( v1, v2 ) >> v1 = [1 4 5 2] >> v2 = [5 3 2 5] >> my_eucdist( v1, v2 ) >> v1 = [1 4 5 2] >> v2 = [5 3 2 5 2 7 9] >> my_eucdist( v1, v2 ) >> v1 = [1 4 5 2] >> v2 = { hello, 3} >> my_eucdist( v1, v2 ) 입력매개변수를검사하는안전한함수 M-file을작성해보자. 잘못된입력이들어올시, 에러메시지를출력하자. (error 함수사용 ) 두벡터의방향이정렬되지않은채입력으로들어올경우에는, 두벡터의방향이서로다르더라도에러를내지않고유클리드거리를계산해주자. ( 이때, try-catch 문을사용하지말고, iscolumn 함수를사용하자 ) 19
Quiz Sol. 지난시간에두벡터를입력받아두벡터의유클리드거리를계산해주는함수 my_eucdist 를작성해보았다. 입력매개변수를검사하는안전한함수 M-file을작성해보자. function [ dist ] = my_eucdist( v1, v2 ) if ~isvector(v1) ~isvector(v2) error(' 입력값이벡터가아닙니다.'); end if ~isnumeric(v1) ~isnumeric(v2) error(' 입력값이벡터가아닙니다.'); end if length(v1) ~= length(v2) error(' 두벡터의길이가서로다릅니다.'); end if iscolumn(v1) ~= iscolumn(v2) v1 = v1'; end dist = sqrt( sum( (v1-v2).^2 ) ); >> v1 = [1 4 5 2] >> v2 = [5 3 2 5 2 7 9] >> my_eucdist( v1, v2 ) Error using my_eucdist (line 8) 두벡터의길이가서로다릅니다. >> v2 = {'hello', 3} >> my_eucdist( v1, v2) Error using my_eucdist (line 8) 입력값이벡터가아닙니다. end 20
sort 함수 배열 X 를정렬하는함수 Y = sort(x, 차원인덱스, 정렬모드 ) 배열 X 를 차원인덱스 방향으로 정렬모드 ( 오름차순 / 내림차순 ) 에맞게정렬 차원인덱스생략시기본값 1, 정렬모드생략시기본값 ascend >> M = randi(100,3,5) M = 49 71 68 12 35 45 76 66 50 59 65 28 17 96 23 >> Y = sort(m, 1, 'ascend') Y = 45 28 17 12 23 49 71 66 50 35 65 76 68 96 59 >> Y = sort(m, 1, 'descend') Y = 65 76 68 96 59 49 71 66 50 35 45 28 17 12 23 정렬방향 >> Y = sort(m, 2, 'ascend') Y = 12 35 49 68 71 45 50 59 66 76 17 23 28 65 96 >> Y = sort(m, 2, 'descend') Y = 71 68 49 35 12 76 66 59 50 45 96 65 28 23 17 21
sort 함수 배열 X 를정렬하는함수 [Y, I] = sort(x, 차원인덱스, 정렬모드 ) 정렬된배열 (Y) 과, 정렬순서 (I) 를함께반환 >> M = randi(100,3,5) M = 49 71 68 12 35 45 76 66 50 59 65 28 17 96 23 >> [Y,I] = sort(m, 1, 'ascend') Y = I = 45 28 17 12 23 49 71 66 50 35 65 76 68 96 59 2 3 3 1 3 1 1 2 2 1 3 2 1 3 2 정렬방향 >> [Y,I] = sort(m, 2, 'ascend') Y = I = 12 35 49 68 71 45 50 59 66 76 17 23 28 65 96 4 5 1 3 2 1 4 5 3 2 3 5 2 1 4 22
sortrows 함수 행렬 X 에서특정열값을기준으로행단위로정렬하는함수 [Y, I] = sortrows(x, 정렬할열인덱스 ) 정렬된행렬 (Y) 과, 정렬순서 (I) 를함께반환 >> M = randi(100,3,5) M = 49 71 68 12 35 45 76 66 50 59 65 28 17 96 23 >> [Y, I] = sortrows(m, 2) Y = I = 65 28 17 96 23 49 71 68 12 35 45 76 66 50 59 3 1 2 정렬대상열 >> [Y, I] = sortrows(m, 5) Y = I = 65 28 17 96 23 49 71 68 12 35 45 76 66 50 59 3 1 2 정렬대상열 23
데이터시각화 : 그래프 김탁은 kmste2@kaist.ac.kr 24
MATLAB 에서지원하는그래프 PLOTS 탭 25
MATLAB 에서지원하는그래프 26
2 차원그래프그려보기 x = -pi:0.1:pi; y1 = sin(x); y2 = cos(x); plot( x, y1, o, x, y2, : ); 27
Figure 창컨트롤 그래프저장 그래프확대및축소 그래프포커스이동 그래프회전 범례표시 28
MATLAB 의 2D Plotting 원리 X 값과 Y 값이아래와같이길이가 n 인벡터로주어졌다고가정 XX = xx 1, xx 2,, xx nn YY = yy 1, yy 2,, yy nn MATLAB 에서그래프를그리는방법은 1. 동일한인덱스를가지는 xx kk, yy kk 값에대해 xx kk, yy kk 값을좌표로하여점을찍음 2. 모든 xx kk, yy kk 점에대해, 인접한점 xx kk 1, yy kk 1 와 xx kk+1, yy kk+1 을선으로연결 29
MATLAB 의 2D Plotting 원리 X=0..pi 범위에서 sin(x) 를그린다고하면, X 와 Y 벡터를아래와같이생성 XX = 0, 0.1, 0.2,, pppp YY = sin 0, sin 0.1, sin 0.2,, sin pppp 두벡터는동일한길이를가지도록생성 MATLAB 에서 plot(x, y) 수행시, 1. 동일한인덱스를가지는 xx kk, yy kk 값에대해 xx kk, yy kk xx kk, sin xx kk 값을좌표로하여 점을찍음 2. 모든 xx kk, yy kk 점에대해, 인접한점 xx kk+1, yy kk+1 을선으로연결 x 값이촘촘할수록 더정확한모양의 그래프가그려짐!! 30
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
그래프곡선속성 x = -pi:0.1:pi; y1 = sin(x); y2 = cos(x); plot( x, y1, o, x, y2, : ); 32
그래프곡선속성 곡선의선모양, 색상, 기호등을각기다르게표현가능 각속성들을조합해서그래프드로잉 곡선속성 기호 의미. 점 x x표 o 원 + 플러스기호 * 별표 s 정방형 기호 d 다이아몬드 v 삼각형 ( 위쪽 ) ^ 삼각형 ( 아래쪽 ) < 삼각형 ( 왼쪽 ) > 삼각형 ( 오른쪽 ) p 오각형 h 육각형 곡선속성기호의미 b 파란색 r 빨강색 g 녹색 c 청록색색종류 m 자홍색 y 노란색 w 흰색 k 검은색곡선속성기호의미 - 실선 : 점선선모양 -. 반점선 -- 긴점선 33
그래프곡선속성 실습 : 그래프곡선속성들을다양하게조합하여그래프를그려보자 >> 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
격자, 라벨, 범례 격자 grid on, grid off 축라벨 x 축 : xlabel( 문자열 ) y 축 : ylabel( 문자열 ) x = 0:0.1:2*pi; y = sin(x); z = exp(-x).*cos(x); plot(x, y, x, z, ':'); grid on; xlabel('x value'); ylabel('y value'); legend( 'sin(x)', 'exp(-x)*cos(x)', -1); 범례 legend( 문자열, 문자열, 범례위치 ) 35
범례 (legend) 의위치 옵션범례의위치 0 데이터와겹치지않는최적위치 1 축의오른쪽위모서리 2 축의왼쪽위모서리 3 축의왼쪽아래모서리 4 축의오른쪽아래모서리 -1 그래프의오른쪽 36
축 (axis) 속성 axis tight 또는 axis( tight ) x = 0:0.1:2*pi; y = cos(x); plot(x,y); >> axis tight 37
축 (axis) 속성 axis( [xmin xmax ymin ymax] ) >> axis( [-1 7-1.2 1.2] ) axis 명령어옵션 axis auto axis equal axis off axis square xlim( [xmin xmax] ) ylim( [ymin ymax] ) 의미기본축한계로되돌아감 x, y, z 축상의데이터단위를동일화축을제거축박스를정사각형으로설정 x축한계를설정 y축한계를설정 38