matlab for c/c++ programmers - ita.kaist.ac.kr · 김탁은. [email protected]. 1. matlab...

38
MATLAB Programming M-file 작성시 유용한 함수들 김탁은 [email protected] 1

Upload: others

Post on 02-Nov-2019

20 views

Category:

Documents


1 download

TRANSCRIPT

MATLAB Programming

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

김 탁 은[email protected]

1

MATLAB Programming

input 함수

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

• r = input( prompt )– prompt 문자열을 화면에 출력하고 사용자의 입력을 기다림– 사용자가 입력한 문자열을 evaluation 하고, 그 결과를 r 값으로 반환– 사용자의 입력에 나타난 변수는 workspace에 미리 선언되어 있어야 함

>> x = 5;>> r = input('변수명이나수식을입력하세요 : ')변수명이나수식을입력하세요 : sin(x^2)

r =-0.1324

>> r = input('변수이름이나수식을입력하세요. : ')변수이름이나수식을입력하세요. : yError using inputUndefined function or variable 'y'.

>> r = input('변수명이나수식을입력하세요 : ')변수명이나수식을입력하세요 : my_triu( magic(4), 1 )

r =

0 2 3 130 0 10 80 0 0 120 0 0 0

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

r =홍길동

>> r = input('변수명이나수식을입력하세요 : ')변수명이나수식을입력하세요 : 'hello world'

r =

hello world 2

MATLAB Programming

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

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, 기본선택버튼 )

msgbox : 일반적인 메세지 dialog box• r = msgbox( 메시지, 타이틀, 아이콘 )

– 아이콘: ‘none’, ‘error’, ‘help’, ‘warn’

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

str =

No 선택한버튼

10

MATLAB Programming

waitbar 함수

진행 상태를 표시하는 dialog를 생성

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

h = waitbar( 0, ‘Please wait…’ );for i = 1:1000

% computation herewaitbar( 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:

namedatebytesisdirdatenum

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

a =1

>> b = false

b =0

연산자 의미

== 대등

~= 같지않음

< 작은

> 큰

<= 작거나같은

>= 크거나같은

16

MATLAB Programming

논리 is* 함수들

입력된 값들이 테스트에 통과하면 true, 실패하면 false를 리턴하는 함수들

논리 is* 함수 기능

ischar 문자열인지테스트

isempty 빈배열(empty array)인지테스트

isequal 두배열이서로동일한지테스트

isfinite Inf가아닌배열원소들검지

isfloat 부동소수점배열(single, double)인지테스트

isinf Inf인배열원소들검지

isinteger 정수배열인지테스트

islogical 논리배열인지테스트

isnan NaN 배열원소들을검지

isnumeric 수치배열 (정수, 부동소수점)인지테스트

isreal 실수배열인지테스트

isscalar 스칼라배열인지테스트

issorted 정렬된벡터인지테스트

isvector 벡터배열인지테스트

iscolumn 열벡터인지테스트

>> 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] )

>> isinteger( int8(1) )>> isinteger( 1.1 )

>> 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] )

>> isvector( [1 2 3] )>> isvector( magic(3) )

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 벡터가 입력될 수 있다.

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

들어올 시, 에러 메시지를 출력하자. (error 함수 사용)

• 두 벡터의 방향이 정렬되지 않은 채 입력으로 들어올 경우에는, 두 벡터의

방향이 서로 다르더라도 에러를 내지 않고 유클리드 거리를 계산해주자. (이

때, try-catch 문을 사용하지 말고, iscolumn 함수를 사용하자)

>> 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 = [5 3 2 5]>> my_eucdist( v1, v2 )

>> v1 = [1 4 5 2]>> v2 = {‘hello’, 3}>> my_eucdist( v1, v2 )

19

MATLAB Programming

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 ) );

end

>> 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)입력값이벡터가아닙니다.

20

MATLAB Programming

sort 함수

배열 X를 정렬하는 함수

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

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

Y =

45 28 17 12 2349 71 66 50 3565 76 68 96 59

>> Y = sort(M, 1, 'descend')

Y =

65 76 68 96 5949 71 66 50 3545 28 17 12 23

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

Y =

12 35 49 68 7145 50 59 66 7617 23 28 65 96

>> Y = sort(M, 2, 'descend')

Y =

71 68 49 35 1276 66 59 50 4596 65 28 23 17

>> M = randi(100,3,5)

M =

49 71 68 12 3545 76 66 50 5965 28 17 96 23

정렬방향

21

MATLAB Programming

sort 함수

배열 X를 정렬하는 함수

• [Y, I] = sort(X, 차원 인덱스, 정렬 모드)– 정렬된 배열(Y)과, 정렬 순서(I)를 함께 반환

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

Y =

45 28 17 12 2349 71 66 50 3565 76 68 96 59

I =

2 3 3 1 31 1 2 2 13 2 1 3 2

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

Y =

12 35 49 68 7145 50 59 66 7617 23 28 65 96

I =

4 5 1 3 21 4 5 3 23 5 2 1 4

>> M = randi(100,3,5)

M =

49 71 68 12 3545 76 66 50 5965 28 17 96 23

정렬방향

22

MATLAB Programming

sortrows 함수

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

• [Y, I] = sortrows(X, 정렬할 열 인덱스)– 정렬된 행렬(Y)과, 정렬 순서(I)를 함께 반환

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

Y =

65 28 17 96 2349 71 68 12 3545 76 66 50 59

I =

312

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

Y =

65 28 17 96 2349 71 68 12 3545 76 66 50 59

I =

312

>> M = randi(100,3,5)

M =

49 71 68 12 3545 76 66 50 5965 28 17 96 23

정렬대상열 정렬대상열

23

MATLAB Programming

데이터 시각화: 그래프

김 탁 은[email protected]

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

그래프 곡선 속성

곡선의 선 모양, 색상, 기호 등을 각기 다르게 표현 가능• 각 속성들을 조합해서 그래프 드로잉

곡선속성 기호 의미

기호

. 점

x x표

o 원

+ 플러스기호

* 별표

s 정방형

d 다이아몬드

v 삼각형 (위쪽)

^ 삼각형 (아래쪽)

< 삼각형 (왼쪽)

> 삼각형 (오른쪽)

p 오각형

h 육각형

곡선속성 기호 의미

색종류

b 파란색

r 빨강색

g 녹색

c 청록색

m 자홍색

y 노란색

w 흰색

k 검은색

곡선속성 기호 의미

선모양

- 실선

: 점선

-. 반점선

-- 긴점선

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

격자, 라벨, 범례

격자• grid on, grid off

축 라벨• x축: xlabel( 문자열 )• y축: ylabel( 문자열 )

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

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);

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