오늘강의내용 (2014/01/21) matlab - kaist it academy web … · 2014-01-22 · c/c++. 의....
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
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
입력/출력 매개변수를 가지는 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의 작동 원리
함수 실행 위해 프롬프트에서 다음을 입력
• 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