오늘강의내용 (2014/01/21) matlab - kaist it academy web … · 2014-01-22 · c/c++. 의....

71
MATLAB Programming 오늘 강의 내용 (2014/01/21) MATLAB 데이터 타입 struct (구조체) M-file 프로그래밍 스크립트 M-file 함수 M-file 프로그램 흐름 제어 if, for, while, switch, continue, break, try-catch 1

Upload: hoangkhue

Post on 10-Jul-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

MATLAB Programming

오늘 강의 내용 (2014/01/21)

MATLAB 데이터 타입• struct (구조체)

M-file 프로그래밍• 스크립트 M-file• 함수 M-file

프로그램 흐름 제어• if, for, while, switch, continue, break, try-catch

1

MATLAB Programming

struct (구조체) 데이터 타입

예) 학사 데이터• 성명: 홍길동• 학번: 20010132• 학점: 3.9

서로 연관 있는 데이터들을 하나의 묶음으로 관리할 수 있도록 하는데이터 타입• 성명, 학번, 학점 등의 데이터는 서로 연관성이 있으므로, 이를 묶어서

관리하는 것이 편리함

Cell과 비슷하게 서로 다른 타입의 데이터들을 저장 가능

Cell과 다르게 각 데이터들은 인덱스가 아니라 이름으로 접근• 성명, 학번, 학점 등

C/C++의 struct와 동일한 개념

C{1,1} = ‘홍길동’C{2,1} = 20010132C{3,1} = 3.9

Cell로 관리하는 것이 편리할까?

2

MATLAB Programming

struct 데이터 타입

struct 데이터 생성

struct의 각 field 접근

>> s = struct('name', '홍길동', 'id', 20010132, 'gpa', 3.9)

s = name: '홍길동'id: 20010132

gpa: 3.9000

>> s.name

ans =

홍길동

>> s.id

ans =

20010132

>> s.gpa

ans =

3.9000

>> s = struct;>> s.name = '홍길동';>> s.id = 20010132;>> s.gpa = 3.9;>> s

s =

name: '홍길동'id: 20010132

gpa: 3.9000

또는

빈 구조체 정의

각 필드 정의

3

MATLAB Programming

struct 데이터 타입

struct의 각 field 값 변경

기존 struct에 새로운 field 추가

>> s.name = '홍길도'

s = name: '홍길도'id: 20010132

gpa: 3.9000

>> s.id = 140001

s = name: '홍길도'id: 140001

gpa: 3.9000

>> s.gpa = 4.3

s = name: '홍길도'id: 140001

gpa: 4.3000

>> s.major = 'Computer Science'

s = name: '홍길도'

id: 140001gpa: 4.3000

major: 'Computer Science' 새로 추가된 필드

4

MATLAB Programming

struct 데이터 생성

다양한 타입의 데이터로 구성 가능

>> a = struct;>> a.city = '서울';>> a.temperature = [0 -3 -5 -7 -1 0 1];>> a.wind = {'북서풍', '약함'}

a =

city: '서울'temperature: [0 -3 -5 -7 -1 0 1]

wind: {'북서풍' '약함'}

>> a.info = struct('pressure', [1013.2 1013.5],'time', [9 10 11]);

>> a

a =

city: '서울'temperatures: [0 -3 -5 -7 2 1]

wind: {'북서풍' '약함'}info: [1x1 struct]

>> a.info

ans = pressure: [1.0132e+03 1.0135e+03]

time: [9 10 11]

구조체내에구조체저장

5

MATLAB Programming

구조체 배열 (struct array)

동일한 구조체들의 나열

구조체 배열 생성 및 각 배열 원소에 접근

>> a = struct;>> a.city = '서울';>> a.temperature = [0 -3 -5 -7 -1 0 1];>> a.wind = {'북서풍', '약함'};

a = city: '서울'

temperature: [0 -3 -5 -7 -1 0 1]wind: {'북서풍' '약함'}

>> weather(10) = a

weather =

1x10 struct array with fields:

citytemperaturewind

>> weather(10)ans =

city: '서울'temperature: [0 -3 -5 -7 -1 0 1]

wind: {'북서풍' '약함'}

>> weather(3)ans =

city: []temperature: []

wind: []

>> weather(10).city

ans =서울

>> weather(10).temperature(4)

ans =-7

6

MATLAB Programming

구조체 배열

구조체 배열 생성 방법 II• 어느 한 필드라도 그 값이 cell array로 정의되면, 모든 필드의 값들도 똑같은

size의 cell array가 된다.

>> weather = struct(‘city’, {‘서울’, ‘대전’, ‘부산‘}, …‘temp’, {-5, 1, 3}, …‘time’, 13)

weather =

1x3 struct array with fields:

citytemptime

>> weather(1)

ans = city: '서울'temp: -5time: 13

>> weather(2)

ans = city: '대전'temp: 1time: 13

>> weather(3)

ans = city: '부산'temp: 3time: 13

7

MATLAB Programming

구조체 배열

구조체 배열 생성 방법 II• 어느 한 필드라도 그 값이 cell array로 정의되면, 모든 필드의 값들도 똑같은 size의 cell

array가 된다.

• cell의 각각 원소가 하나씩 뽑혀져 구조체를 생성하고, 그 구조체가 순서대로 모여구조체 배열을 이룸

>> weather = struct(‘city’, {‘서울’, ‘대전’, ‘부산‘}, …‘temp’, {-5, 1, 3}, …‘time’, 13)

weather =

1x3 struct array with fields:

citytemptime

>> weather(1)

ans = city: '서울'temp: -5time: 13

>> weather(2)

ans = city: '대전'temp: 1time: 13

>> weather(3)

ans = city: '부산'temp: 3time: 13 8

MATLAB Programming

구조체 배열

구조체 배열 생성 방법 II

• 서로 다른 필드에서 cell size가 동일하지 않으면?

>> weather = struct(‘city’, {‘서울’, ‘대전’, ‘부산‘}, …‘temp’, {-5, 1}, …‘time’, 13)

Error using structArray dimensions of input '4' must match those of input '2', or be scalar.

1 x 3 cell array

1 x 2 cell array

9

MATLAB Programming

구조체 배열

빈 구조체 배열 생성 방법 III

• 한 field에 빈 cell을 생성하면, 해당 cell 크기와 동일한 크기의 구조체 배열생성

>> weather = struct('city', cell(1,5), 'temp', [], 'time', [])

weather =

1x5 struct array with fields:

citytemptime

>> weather(1)

ans =

city: []temp: []time: []

1 x 5 cell array

10

MATLAB Programming

struct 데이터 생성시 주의할 점

두 결과가 왜 다른가?

>> a = struct;>> a.city = '서울';>> a.temperature = [0 -3 -5 -7 -1 0 1];>> a.wind = {'북서풍', '약함'}

a =

city: '서울'temperature: [0 -3 -5 -7 -1 0 1]

wind: {'북서풍' '약함'}

>> a = struct('city', '서울', 'temperatures',[0 -3 -5 -7 2 1], 'wind', {'북서풍', '약함'})

a =

1x2 struct array with fields:

citytemperatureswind

>> a(1)

ans =

city: '서울'temperatures: [0 -3 -5 -7 2 1]

wind: '북서풍'

>> a(2)

ans =

city: '서울'temperatures: [0 -3 -5 -7 2 1]

wind: '약함'

11

MATLAB Programming

struct 데이터 생성시 주의할 점

두 결과를 같게 만드려면?• cell array를 제외한 필드를 먼저 생성하고, cell array를 위한 필드를 추가

>> a = struct;>> a.city = '서울';>> a.temperature = [0 -3 -5 -7 -1 0 1];>> a.wind = {'북서풍', '약함'}

a =

city: '서울'temperature: [0 -3 -5 -7 -1 0 1]

wind: {'북서풍' '약함'}

>> a = struct('city', '서울', 'temperatures',[0 -3 -5 -7 2 1]);

>> a.wind = {'북서풍', '약함'}

a =

city: '서울'temperatures: [0 -3 -5 -7 2 1]

wind: {'북서풍' '약함'}

12

MATLAB Programming

Quiz

아래와 같이 학적에 관한 구조체를 생성해봅시다.

student

student(1)

.name

“김철수”

.id

20130142

.gpa

.semester

봄학기

.score

[3.4 3.5 3.9 4.1]

student(2)

.name

“이민수”

.id

20130562

.gpa

.semester

봄학기

.score

[3.5 3.1 3.9 3.6]

13

MATLAB Programming

Quiz Sol.

아래와 같이 학적에 관한 구조체를 생성해봅시다.student

student(1)

.name

“김철수”

.id

20130142

.gpa

.semester

봄학기

.score

[3.4 3.5 3.9 4.1]

student(2)

.name

“이민수”

.id

20130562

.gpa

.semester

봄학기

.score

[3.5 3.1 3.9 3.6]

>> students = struct('name', {'김철수', '이민수'}, 'id', {20130142, 20130562}, 'gpa', struct())

>> students(1).gpa.semester = '봄학기‘

>> students(1).gpa.score = [3.4 3.5 3.9 4.1]

>> students(2).gpa.semester = '봄학기‘

>> students(2).gpa.score = [3.5 3.1 3.9 3.6]14

MATLAB Programming

여러 필드에 동시에 접근하기

앞의 Quiz에서 생성한 students 구조체 배열에서, 모든 학생들의 이름을 얻어오고 싶을 때

• 방법 I. students 배열의 길이만큼 변수를 적어준다.

• 방법 II. 동일한 길이의 좌변 (LHS) 배열에 할당해준다.

>> [n1, n2] = students.name

n1 =김철수

n2 =이민수

>> z = cell( length(students), 1 )>> [z{:}] = students.name

>> z(1)

ans = '김철수'

>> z(2)

ans = '이민수' 15

MATLAB Programming

구조체 필드 삭제, 이름 얻어오기

필드 삭제 : rmfield

구조체의 필드 이름 얻어오기

>> students = rmfield(students, 'gpa')

students =

1x2 struct array with fields:

nameid

>> fieldnames(students)

ans =

'name''id'

16

MATLAB Programming

구조체 필드 정렬

orderfields 함수

• 구조체 배열의 field를 정렬

• snew = orderfields( sold )

구조체/구조체 배열 sold의 field를 사전 순서대로 정렬

• snew = orderfields( sold , c )

구조체/구조체 배열을 cell c에 적힌 fieldname 순으로

정렬

• snew = orderfields( sold , perm )

구조체/구조체 배열을 perm 순서대로 정렬

• [snew , perm] = orderfields( … )

field를 각 정렬 방법에 따라 정렬하고, 정렬된 구조체

snew와 필드의 정렬 순서를 함께 리턴

>> sold = struct('b', 2, 'c', 3, 'a', 1)

sold = b: 2c: 3a: 1

>> snew = orderfields(sold)

snew = a: 1b: 2c: 3

>> snew = orderfields(sold, {'a', 'c', 'b'})

snew = a: 1c: 3b: 2

>> snew = orderfields(sold, [3 2 1])

snew = a: 1c: 3b: 2

>> [snew, perm] = orderfields(sold)

snew = a: 1b: 2c: 3

perm =312 17

MATLAB Programming

구조체의 is* 함수

isfield

• 구조체의 field가 맞으면 true, 아니면 false 리턴

• TF = isfield( s, fieldname )

isstruct

• 구조체가 맞으면 true, 아니면 false 리턴

• TF = isstruct( s )

>> s = struct('one',1,'two',2)

s = one: 1two: 2

>> fields = isfield(s,{'two','pi','One',3.14})

fields =1 0 0 0

>> isstruct(struct('name', 1))

ans =1

>> isstruct({1, 2, 'hi'})

ans =0

18

MATLAB Programming

cell 데이터를 struct 데이터로 변환

cell2struct

• S = cell2struct( C, FIELDS, DIM )

• cell 배열 C를 구조체 S로 변환

• FIELDS 는 구조체 S로 변환되었을 때 field 이름

• size(C, dim) 은 FIELDS 에 기술된 field 이름의 개수와 동일해야 함

>> c = {'tree',37.4,'birch'}

c =

'tree' [37.4000] 'birch'

>> f = {'category','height','name'}

f =

'category' 'height' 'name'

>> s = cell2struct(c,f,2)

s =

category: 'tree'height: 37.4000

name: 'birch'

19

MATLAB Programming

cell 데이터를 struct 배열 데이터로 변환

cell2struct

• S = cell2struct( C, FIELDS, DIM )

>> c = {'jisung park' 185 'korea'; 'bumgun cha', 182, 'korea'}

c = 'jisung park' [185] 'korea''bumgun cha' [182] 'korea'

>> f = {'name' 'height' 'nationality'}

f = 'name' 'height' 'nationality'

>> s = cell2struct(c, f, 2)

s =

2x1 struct array with fields:

nameheightnationality

>> s(1)

ans =

name: 'jisung park'height: 185

nationality: 'korea'

>> s(2)

ans =

name: 'bumgun cha'height: 182

nationality: 'korea'

20

MATLAB Programming

struct 데이터를 cell 데이터로 변환

struct2cell

• C = struct2cell( S )

• P개의 field를 가진 M x N 구조체 배열을 P x M x N cell 배열로 변환

• 구조체 배열이 1차원인 경우, P x size(S) cell 배열로 변환

>> s2 = struct;>> s2.cateogry = 'tree';>> s2.height = 37.4;>> s2.name = 'birch';>> s2

s2 =

cateogry: 'tree'height: 37.4000name: 'birch'

>> c = struct2cell(s2)

c = 'tree' [37.4000]'birch'

>> f = fieldnames(s2)

f = 'cateogry''height''name'

21

MATLAB Programming

struct 배열을 cell 배열로 변환

struct2cell

• C = struct2cell( S )

>> struct2cell(s)

ans =

'jisung park' 'bumgun cha'[ 185] [ 182]'korea' 'korea'

>> f = fieldnames(s)

f =

'name''height''nationality'

22

MATLAB Programming

struct 배열을 cell 배열로 변환

struct2cell

• C = struct2cell( S )

• 3개의 field를 가진 2 x 2 구조체 배열을 3 x 2 x 2 cell 배열로

변환하는 예

>> sr = repmat(s, 1, 2)

sr =

2x2 struct array with fields:

nameheightnationality

>> c = struct2cell(sr)

c(:,:,1) =

'jisung park' 'bumgun cha'[ 185] [ 182]'korea' 'korea'

c(:,:,2) =

'jisung park' 'bumgun cha'[ 185] [ 182]'korea' 'korea'

23

MATLAB Programming

M-file 프로그래밍

김 탁 은[email protected]

24

MATLAB Programming

M-file

MATLAB 명령어들을 포함하는 텍스트 파일

실행할 명령어가 길어서 일일이 Command Window에 입력할 수 없거나, 반복적으로 사용해야

하는 경우 M-file로 코드를 한번만 작성해 두면 여러 번 재사용 가능

파일의 확장자는 반드시 “.m”이어야 함

M-file 종류

• 스크립트 M-file

– 연속적인 MATLAB 명령어들의 모임

• 함수 M-file

– 입력 매개변수와 출력 매개변수, 매개변수들을 처리하는 routine

M-file 편집기

• 일반 텍스트 편집기

• MATLAB 에디터

25

MATLAB Programming

스크립트 M-file

연속적인 MATLAB 명령어들의 모임

실행하면 M-file에 적힌 명령어들이 순서대로 실행

스크립트 M-file의 파일명은 원하는 대로 정할 수 있음

실행 방법은

• 1) Editor를 실행하여 “Run” 버튼을 누르거나,

• 2) Command Window에서 스크립트 M-file의 이름 (.m 확장자 제외) 입력

스크립트 M-file에서 정의한 변수들은 workspace 창에 나타남

• 만약 스크립트 M-file이 함수 M-file 내에서 호출된다면, 스크립트 M-file에서

생성된 변수들은 MATLAB 인터페이스의 workspace 창에 나타나지 않음

26

MATLAB Programming

스크립트 M-file 편집 및 실행

“New Script” 아이콘 클릭하거나, Ctrl+N 키로 Editor 실행

27

MATLAB Programming

스크립트 M-file 편집 및 실행

명령어 입력, 파일 저장, 실행

28

MATLAB Programming

스크립트 M-file 실행과 Profiler

“Run and Time” 클릭 시 수행 결과와 함께 Profiler 실행

29

MATLAB Programming

함수 M-file

입력/출력 매개변수를 가지는 routine

함수 정의부(헤더)에 함수 이름을 부여해야 함

함수 M-file의 파일 이름 (확장자 .m 제외) 에 따라 함수 이름이 결정됨

• 파일 이름과 함수 이름이 다르면, 파일명을 함수 이름으로 사용함

• 따라서 파일 이름과 함수 이름이 일치하도록 해야 함

함수 내에서 생성된 변수들은 함수 workspace에서만 사용 됨

• 함수 내에서 사용되는 변수들은 지역 변수(또는 내부 변수) 이므로, MATLAB GUI 상의 Workspace에는

나타나지 않음

• 변수들은 함수의 호출이 끝나는 시점에 사라짐

함수의 실행

• Command Window의 프롬프트에서 호출하거나, 다른 함수 또는 스크립트 M-file에서 함수 호출

30

MATLAB Programming

함수 M–file 작성하는 두 가지 방법

방법 1) “New” “Function” 선택 방법 2) “New Script” 선택 후 Editor에서 function 헤더 직접 입력

31

MATLAB Programming

간단한 함수 M-file

Factorial 계산하는 함수• 아래와 같이 함수 작성 후 factorial.m 으로 저장

• 함수 실행을 위해 Command Window에서 다음과 같이 입력

>> factorial(5)

32

MATLAB Programming

함수 M-file의 구조

함수 몸체

함수 헤더

함수 끝

함수명입력 매개변수출력

매개변수

33

MATLAB Programming

함수 M-file의 작동 원리

함수 실행 위해 프롬프트에서 다음을 입력

• 1. Current Directory에서 factorial.m 파일이 있는지 확인• 2. factorial.m 파일이 함수 M-file인지 확인

>> a = factorial( 5 )

34

MATLAB Programming

함수 M-file의 작동 원리

함수 실행 위해 프롬프트에서 다음을 입력

• 1. Current Directory에서 factorial.m 파일이 있는지 확인• 2. factorial.m 파일이 함수 M-file인지 확인• 3. 입력 매개변수 복사

>> a = factorial( 5 )

function [ y ] = factorial( n )% 팩토리얼 계산 함수

y = 1;

for i = 1:ny = y * i;

end

end

35

MATLAB Programming

함수 M-file의 작동 원리

함수 실행 위해 프롬프트에서 다음을 입력

• 1. Current Directory에서 factorial.m 파일이 있는지 확인• 2. factorial.m 파일이 함수 M-file인지 확인• 3. 입력 매개변수 복사• 4. 출력 매개변수에 결과값 복사

>> a = factorial( 5 )

function [ y ] = factorial( n )% 팩토리얼 계산 함수

y = 1;

for i = 1:ny = y * i;

end

end

36

MATLAB Programming

함수 M-file: 다수의 입력 및 출력 매개변수

함수 M-file은 다수의 입력 및 출력 매개변수를 가질 수 있음 함수 호출 시 다수의 입출력 매개변수는 아래와 같이 전달됨

>> [a, b, c, d, e] = my_func( m, n, p, q, r, s )

function [ o1, o2, o3, o4, o5 ] = my_func( i1, i2, i3, i4, i5, i6 )

% 함수 본체를 여기에 기술

o1 = …; o2 = …; o3 = …; o4 = …; o5 = …;

end

37

MATLAB Programming

함수 M-file: 다수의 입력 및 출력 매개변수

함수 M-file은 다수의 입력 및 출력 매개변수를 가질 수 있음 함수 호출 시 다수의 입출력 매개변수는 아래와 같이 전달됨

>> [a, b, c, d, e] = my_func( m, n, p, q, r, s )

function [ o1, o2, o3, o4, o5 ] = my_func( i1, i2, i3, i4, i5, i6 )

% 함수 본체를 여기에 기술

o1 = …; o2 = …; o3 = …; o4 = …; o5 = …;

end

입력매개변수값전달

38

MATLAB Programming

함수 M-file: 다수의 입력 및 출력 매개변수

함수 M-file은 다수의 입력 및 출력 매개변수를 가질 수 있음 함수 호출 시 다수의 입출력 매개변수는 아래와 같이 전달됨

>> [a, b, c, d, e] = my_func( m, n, p, q, r, s )

function [ o1, o2, o3, o4, o5 ] = my_func( i1, i2, i3, i4, i5, i6 )

% 함수 본체를 여기에 기술

o1 = …; o2 = …; o3 = …; o4 = …; o5 = …;

end

출력매개변수에결과값리턴

39

MATLAB Programming

Quiz

n-차원 공간상의 두 점을 입력 받아 두 점 사이의 맨해튼 거리와

유클리디안 거리를 계산해주는 함수를 작성해 보자.

• Note

– n-차원 공간상의 점 ≡ 1 x n 벡터

– 두 점 (x1, x2, …, xn)와 (y1, y2, …, yn)의 맨해튼 거리 : |x1-y1| + |x2-y2| + … + |xn-yn|

40

MATLAB Programming

Quiz Sol.

n-차원 공간상의 두 점을 입력 받아 두 점 사이의 맨해튼 거리와

유클리디안 거리를 계산해주는 함수를 작성해 보자.% ndist.m

function [ mdist, edist ] = ndist( v1, v2 )

mdist = sum( abs(v1-v2) );edist = sqrt( sum( (v1 - v2) .^2 ) );

end

>> v1 = [6 1 2 5]v1 =

6 1 2 5

>> v2 = [3 5 1 2]v2 =

3 5 1 2

>> [md, ed] = ndist( v1, v2 )

md =

11

ed =

5.9161

함수정의

실행결과

41

MATLAB Programming

프로그램 흐름 제어 (Flow Control)

프로그램 흐름제어를 위한 statements

• if, for, while, switch, continue, break

흐름 제어?

• 프로그램 수행 중 조건에 따른 명령어의 분기 (if, switch)

• 명령어의 반복 (for, while)

• 명령어 pass (continue)

• 명령어 중단 (break)

42

MATLAB Programming

if 문

Syntax

• 조건 논리식이 맞지 않으면, 그 다음 조건 논리식을 검사

• 조건 논리식이 맞으면 명령어 문장을 수행하고 if문 종료

if (조건 논리식)

(명령어 문장들)

elseif (조건 논리식)

(명령어 문장들)

else

(명령어 문장들)

end

𝑓𝑓 𝑡𝑡 =

1 , 𝑡𝑡 = 0sin(𝜋𝜋𝑡𝑡)𝜋𝜋𝑡𝑡 , 𝑡𝑡 > 0

−1 , 𝑡𝑡 < 0

if t == 0

f = 1

elseif t > 0

f = sin(pi*t)/(pi*t)

else

f = -1

end

조건이맞지않으면…

43

MATLAB Programming

if 문

여러 줄에 걸쳐 쓰거나, 한 줄에 써도 무방

조건 논리식에 scalar 값이 아니라, 배열(array) 값이 주어질 수도 있음• 배열의 모든 원소의 값이 0 (즉, False)가 아니어야 조건 논리식이 참(True)

if x > 0x = sqrt(x);

endif x > 0, x = sqrt(x); end≡

>> M = magic(2)

M =

1 34 2

>> if M, disp(‘nonzero array!’); endnonzero array!

>> M = diag([1 2])

M =

1 00 2

>> if M, disp(‘nonzero array!’); end>>

44

MATLAB Programming

Quiz

입력 변수 x의 값이 짝수인지, 홀수인지 판별하고, 짝수이면 0,

홀수이면 1을 반환하는 함수 M-file을 작성해보자.

• Hint

– mod(a,b) 함수 : a/b를 하여 나머지를 반환하는 함수

45

MATLAB Programming

Quiz Sol.

입력 변수 x의 값이 짝수인지, 홀수인지 판별하고, 짝수이면 0, 홀수이면 1을

반환하는 함수 M-file을 작성해보자.

% oddntest.m

function [ val ] = oddntest( x )

if mod(x, 2) == 0val = 0;

else val = 1;

end

end

>> oddntest(5)

ans =

1

>> oddntest(4)

ans =

0

함수정의 실행결과

46

MATLAB Programming

for 문

Syntax

• 증가분을 입력하지 않으면, 기본값은 1

for 인덱스변수=초기값:증가분:최종값(명령어 문장들)

end

% 팩토리얼

>> y = 1>> for x = 1:5, y = y * x; end>> y

y =

120

for 인덱스변수= 배열(명령어 문장들)

end

>> for x = [pi/6 pi/4 pi/3], disp([x sin(x)]); end

0.5236 0.50000.7854 0.70711.0472 0.8660

47

MATLAB Programming

for 문

for 문의 중첩• (i, j) 원소가 j ≥ i일 때, i/j인 5 x 5 행렬 A 생성

for문과 continue의 사용• 5 이하의 값은 출력 하지 않음

n = 5;A = eye(n);for j = 2:n

for i = 1:j-1A(i, j) = i / j;

endend

>> A

A =1.0000 0.5000 0.3333 0.2500 0.2000

0 1.0000 0.6667 0.5000 0.40000 0 1.0000 0.7500 0.60000 0 0 1.0000 0.80000 0 0 0 1.0000

for i = 1:10if i < 5, continue; enddisp(i);

end

5678910

1 1/2 1/3 1/4 1/50 1 2/3 2/4 2/50 0 1 3/4 3/50 0 0 1 4/50 0 0 0 1

48

MATLAB Programming

Quiz

for 문을 이용하여 황금률 𝟏𝟏+ 𝟓𝟓𝟐𝟐를 근사적으로 나타내는 다음과 같은

연속되는 분수를 계산해 보자.

1 +1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 1

49

MATLAB Programming

Quiz Sol.

for 문을 이용하여 황금률 𝟏𝟏+ 𝟓𝟓𝟐𝟐를 근사적으로 나타내는 다음과 같은

연속되는 분수를 계산해 보자.

1 +1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 1

r = 2;n = 100;

for i = 1:n r = 1 + 1 / r;

end

format longr

함수정의

r =

1.618033988749895

실행결과

50

MATLAB Programming

Quiz

지난 시간에 배운 Upper Triangular Matrix를 만드는 함수 triu(M, k)를

함수 M-file로 직접 구현해보자.

• Hint: for, if, continue 사용

% my_triu.m

function [ uM ] = my_triu( M, k )

[m, n] = size( M );uM = zeros( m, n );

% 이 부분을 채워봅시다.

end

함수정의

51

MATLAB Programming

Quiz Sol.

지난 시간에 배운 Upper Triangular Matrix를 만드는 함수 triu(M, k)를

함수 M-file로 직접 구현해보자.

% my_triu.m

function [ uM ] = my_triu( M, k )

[m, n] = size( M );uM = zeros( m, n );

for ri=1:mfor ci=1:n

if ri + k > cicontinue

enduM(ri,ci) = M(ri,ci);

endend

end

함수정의 >> my_triu(magic(4),1)

ans =0 2 3 130 0 10 80 0 0 120 0 0 0

>> my_triu(magic(3),0)

ans =8 1 60 5 70 0 2

>> my_triu(magic(4),-1)

ans =16 2 3 13

5 11 10 80 7 6 120 0 15 1

실행결과

52

MATLAB Programming

while 문

Syntax

• 논리 조건식이 참이면 명령어 문장들이 수행• 논리 조건식이 거짓이면 반복문을 빠져 나옴

while (논리 조건식)(명령어 문장들)

end

% 0이 아닌 가장 작은 부동 소수점

x = 1;while true

xmin = x;x = x / 2;if x == 0, break, end

endxmin

xmin =4.9407e-324

% 무한 수열의 합

n = 1;oldsum = -1;newsum = 0;while newsum > oldsum

oldsum = newsum;newsum = newsum + n^(-4);n = n + 1;

endnewsum

newsum =1.0823

114

+ 124

+ 134

+ …

53

MATLAB Programming

switch 문

Syntax

• 표현이 평가된 후, 그 값이 일치하는 case 문의

명령어 문장들을 수행

• 일치하는 값이 없는 경우 otherwise 의 명령어

문장들을 수행

• otherwise는 생략 가능

switch (표현)case (값)

(명령어 문장들)case (값)

(명령어 문장들)otherwise

(명령어 문장들)end

% count.m

function y = count ( x )

switch xcase 1

y = ‘one’case 2

y = ‘two’otherwise

y = ‘many’end

>> count(1)ans =one

>> count(2)ans =two

>> count(3)ans =many

54

MATLAB Programming

Quiz

벡터 𝑿𝑿 = 𝒙𝒙𝟏𝟏,𝒙𝒙𝟐𝟐, … ,𝒙𝒙𝒏𝒏 가 있을 때, 벡터 X의 1-norm, 2-norm, ∞-norm은다음과

같이정의된다.

• 𝑋𝑋 1 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖

• 𝑋𝑋 2 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖2

• 𝑋𝑋 ∞ ≔ max( 𝑥𝑥𝑖𝑖 )

벡터 X와 p값을입력으로받아 p-norm의값을계산하는함수를작성해보자. (switch

문을꼭사용)

• p 는 1, 2, Inf 값을 사용

55

MATLAB Programming

Quiz Sol.

벡터 𝑿𝑿 = 𝒙𝒙𝟏𝟏,𝒙𝒙𝟐𝟐, … ,𝒙𝒙𝒏𝒏 가 있을 때, 벡터 X의 1-norm, 2-norm, ∞-norm은다음과같이

정의된다.

• 𝑋𝑋 1 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖

• 𝑋𝑋 2 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖2

• 𝑋𝑋 ∞ ≔ max( 𝑥𝑥𝑖𝑖 )

벡터 X와 p값을입력으로받아 p-norm의값을계산하는함수를작성해보자.

(switch 문을꼭사용) % pnorm.m

function [ dist ] = pnorm( X, p )

switch pcase 1

dist = sum(abs(X));case 2

dist = sqrt(X’ * X);case Inf

dist = max(abs(X));otherwise

error( ‘p값은 1, 2, Inf 만 가능‘)end 56

MATLAB Programming

try-catch

try-catch 문은 프로그램 수행 시 오류가 발생될 경우 예외 처리를 하기위해 사용

Syntax

try(명령어 문장들)

catch(명령어 문장들)

end

x = [4 2 6];y = [5 3];

tryz = dot(x, y)

catchdisp(‘x와 y는 차원이 다름.’)

end

에러발생시…

57

MATLAB Programming

Quiz

두 벡터를 입력 받아 두 벡터의 유클리드 거리를 계산해주는 함수

my_eucdist 를 작성해보자.

• 입력으로 들어오는 두 벡터 모두 행 벡터 또는 열 벡터로 정렬되지 않을 수도

있다.

• 예를 들면, 아래와 같이 v1, v2 벡터가 입력될 수 있다.

• try-catch 문을 사용하여 두 벡터의 방향이 서로 다르더라도 에러를 내지

않고 유클리드 거리를 계산해주는 함수 M-File을 작성해보자.

>> 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]>> my_eucdist( v1, v2 )

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

58

MATLAB Programming

Quiz Sol.

두 벡터를 입력 받아 두 벡터의 유클리드 거리를 계산해주는 함수

my_eucdist 를 작성해보자.

function [ dist ] = my_eucdist( v1, v2 )

tryd = v1 - v2;

catchd = v1 - v2';

endsd = sum(d.^2);dist = sqrt(sd);

end

>> v1 = [1 3 2 4];>> v2 = [5 2 3 1];>> my_eucdist(v1',v2)

ans =5.1962

>> my_eucdist(v1, v2')

ans =5.1962

59

MATLAB Programming

함수의 재귀 호출 (Recursive Call)

재귀 호출이란?

• 어떤 함수 M-file 내에서 자기 자신을 또 다시 호출하는 것

예: 피보나치 수열 계산

• fib(x) = fib(x-1) + fib(x-2) 이고, fib(0) = 0, fib(1) = 1 인 점화식

function [ v ] = fib( x )

if x == 0v = 0;return;

elseif x == 1v = 1;return;

end

v = fib(x-1) + fib(x-2);

end

>> fib(0)ans =

0

>> fib(1)ans =

1

>> fib(2)ans =

1

>> fib(3)ans =

2

>> fib(4)ans =

3

>> fib(5)ans =

5

>> fib(6)ans =

8

>> fib(7)ans =

13 60

MATLAB Programming

함수의 재귀 호출 (Recursive Call)function [ v ] = fib( x )

if x == 0v = 0;return;

elseif x == 1v = 1;return;

end

v = fib(x-1) + fib(x-2);

end

fib(6)

fib(5) fib(4)

fib(4) fib(3) fib(3) fib(2)

fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0)

fib(1) fib(0)fib(1) fib(0)fib(1) fib(0)fib(1)fib(2)

fib(1) fib(0)

재귀호출트리

61

MATLAB Programming

Quiz

for 문을 이용하여 황금률 𝟏𝟏+ 𝟓𝟓𝟐𝟐를 근사적으로 나타내는 문제를

풀어보았다. 이번에는 재귀함수를 사용하여 다음 연속되는 분수를

계산해 보자.

1 +1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 1

% nrepeat : 몇번을 재귀적으로 계산할지 정하는 수% v : 황금률의 근사값

function [ v ] = grule( nrepeat )

% 여기를 채우세요.

end

함수 M-file 모양

62

MATLAB Programming

Quiz Sol.

for 문을 이용하여 황금률 𝟏𝟏+ 𝟓𝟓𝟐𝟐를 근사적으로 나타내는 문제를

풀어보았다. 이번에는 재귀함수를 사용하여 다음 연속되는 분수를

계산해 보자.

1 +1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 1

function [ v ] = grule( nrepeat )

if nrepeat == 0v = 2;return;

end

v = 1 + 1 / grule(nrepeat-1);

end

함수정의

>> format long>> (1+sqrt(5))/2

ans =

1.618033988749895

>> grule(50)

ans =

1.618033988749895

>> format short

실행결과

63

MATLAB Programming

Anonymous Function (익명 함수)

익명 함수란?

• 함수 M-file과 달리 파일에 저장하지 않고 사용되는 함수

• 반복적으로 사용되는 간단한 명령어의 처리에 적합

• 함수 M-file과 동일하게 입력과 출력이 있음

• 함수 M-file과는 달리 여러 명령어를 묶어서 함수화 할 수 없음

(단일 명령어로만 구성됨)

Syntax

• 함수핸들 = @( 입력매개변수들 ) 표현

64

MATLAB Programming

Anonymous Function (익명 함수)

익명 함수의 예

• 𝑓𝑓 𝑥𝑥 ≔ 2𝑥𝑥2 − 3 를 익명함수와 일반 함수 M-file로 만드는 경우,

>> f = @(x) 2*x^2 - 3

f =

@(x)2*x^2-3

>> f(3)

ans =

15

% poly.m

function [ y ] = poly( x )

y = 2*x^2 - 3;

end

>> poly(3)

ans =

15

익명 함수 함수 M-file

65

MATLAB Programming

Anonymous Function (익명 함수)

다중 입력 매개변수

• 𝑓𝑓 𝑥𝑥,𝑦𝑦 ≔ 2𝑥𝑥2 − 𝑦𝑦3 + 1 를 익명함수로 만들면,

>> f = @(x, y) 2*x^2 - y^3 + 1

f =

@(x,y)2*x^2-y^3+1

>> f(1,3)

ans =

-24

66

MATLAB Programming

Anonymous Function (익명 함수)

미리 정의 된 (workspace 상에 있는) 변수를 사용하는 익명 함수

• 변수 A, B, C가 미리 어떤 값으로 정의되어 있을 때,

𝑓𝑓 𝑥𝑥,𝑦𝑦, 𝑧𝑧 ≔ 𝐴𝐴𝑥𝑥2 + 𝐵𝐵𝑦𝑦2 + 𝐶𝐶𝑧𝑧2 + 1 를 익명함수로 만들면,

>> A = 1; B = 2; C = 0.5;>> f = @(x, y, z) A*x^2 + B*y^2 + C+z^2 + 1

f =

@(x,y,z)A*x^2+B*y^2+C+z^2+1

>> f(1, 3, 2)

ans =

24.5000

67

MATLAB Programming

Anonymous Function (익명 함수)

입력 매개변수를 받지 않는 익명 함수

>> t = @() datestr(now)

t =

@()datestr(now)

>> t()

ans =

16-Jan-2014 10:29:55

68

MATLAB Programming

Anonymous Function (익명 함수)

다수의 값을 출력하는 익명 함수

• 예를 들어, 어떠한 입력 배열에 대해 최소값과 최대값을 동시에

찾아주는 함수

>> minmax = @( M ) deal( min(min(M)), max(max(M)) )

minmax =

@(M)deal(min(min(M)),max(max(M)))

>> [A, B] = minmax( magic(5) )

A =1

B =25

>> [A, B] = minmax ( [6 3 2; 4 7 5] )

A =2

B =7

69

MATLAB Programming

Anonymous Function (익명 함수)

익명 함수의 집합

>> f = { @(x) x.^2; @(y) y+10; @(x,y) x.^2 + y + 10 }

f =

@(x)x.^2 @(y)y+10 @(x,y)x.^2+y+10

>> class(f)

ans =

cell

>> x = 1; y = 2;>> f{1}(x)

ans =1

>> f{2}(y)

ans =12

>> f{3}(x,y)

ans =13

70

MATLAB Programming

1, 2, inf-norm을 익명 함수로 정의하기

벡터 𝑿𝑿 = 𝒙𝒙𝟏𝟏,𝒙𝒙𝟐𝟐, … ,𝒙𝒙𝒏𝒏 가 있을 때, 벡터 X의 1-norm, 2-norm, ∞-norm은다음과같이정의된다.

• 𝑋𝑋 1 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖

• 𝑋𝑋 2 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖2

• 𝑋𝑋 ∞ ≔ max( 𝑥𝑥𝑖𝑖 )

벡터 X와 p값을입력으로받아 p-norm의값을계산하는함수를작성해보자.

(switch 문을꼭사용)

% pnorm.m함수 M-file로 정의

function [ dist ] = pnorm( X, p )

switch pcase 1

dist = sum(abs(X));case 2

dist = sqrt(X’ * X);case Inf

dist = max(abs(X));otherwise

error( ‘p값은 1, 2, Inf 만 가능‘)end

% anonymous function

>> pnorm = { @(x) sum(abs(x)); @(x) sqrt(x' * x); @(x) max(abs(x))}

pnorm =

@(x)sum(abs(x))@(x)sqrt(x'*x) @(x)max(abs(x))

>> v = [1 5 4 2 3 6]‘;

>> pnorm{1}(v) % 1 norm

ans =21

>> pnorm{2}(v) % 2 norm

ans =9.5394

>> pnorm{3}(v) % inf norm

ans =6

71