MATLAB Programming
오늘 강의 내용 (2014/01/08)
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에서 생성한 students 구조체 배열에서, 모든 학생들의 이름을얻어오고 싶을 때• 방법 I. students 배열의 길이만큼 변수를 적어준다.
• 방법 II. 동일한 길이의 좌변 (LHS) 배열에 할당해준다.
>> [n1, n2] = students.name
n1 =김철수
n2 =이민수
>> z = {}>> [z{1,1:length(students)}] = students.name
>> z(1)
ans = '김철수'
>> z(2)
ans = '이민수'
14
MATLAB Programming
구조체 필드 조작 명령어
필드 삭제 : rmfield
구조체의 필드 이름 얻어오기
>> students = rmfield(students, 'gpa')
students =
1x2 struct array with fields:
nameid
>> fieldnames(students)
ans =
'name''id'
15
MATLAB Programming
M-file
MATLAB 명령어들을 포함하는 텍스트 파일
실행할 명령어가 길어서 일일이 Command Window에 입력할 수 없거나, 반복적으로 사용해야 하는 경우를 위해 M-file이 필요
확장자는 반드시 “.m”이어야 함
M-file 종류• 스크립트 M-file
– 연속적인 MATLAB 명령어들의 모임
• 함수 M-file– 입력 매개변수와 출력 매개변수, 매개변수들을 처리하는 routine
M-file 편집기• 일반 텍스트 편집기• MATLAB 에디터
17
MATLAB Programming
스크립트 M-file
연속적인 MATLAB 명령어들의 모임
실행하면 M-file에 적힌 명령어들이 순서대로 실행
스크립트 M-file의 파일명은 원하는 대로 정할 수 있음
실행 방법은• 1) Editor를 실행하여 “Run” 버튼을 누르거나,• 2) Command Window에서 스크립트 M-file의 이름 (.m 확장자 제외) 입력
명령어들이 실행되면서 생성된 변수들은 Workspace상에 나타남• 만약 스크립트 M-file이 함수 M-file 내에서 호출된다면, 스크립트 M-file에서
생성된 변수들은 MATLAB GUI 상의 Workspace에 나타나지 않음
18
MATLAB Programming
함수 M-file
입력/출력 매개변수를 가지는 routine
함수 정의부(헤더)에 함수 이름을 부여해야 함
함수 M-file의 파일 이름 (확장자 .m 제외) 에 따라 함수 이름이 결정됨• 파일 이름과 함수 이름이 다르면, 파일명을 함수 이름으로 사용함• 따라서 파일 이름과 함수 이름이 일치하도록 해야 함
함수 내에서 생성된 변수들은 함수 workspace에서만 사용 됨• 함수 내에서 사용되는 변수들은 지역 변수(또는 내부 변수) 이므로, MATLAB
GUI 상의 Workspace에는 나타나지 않음• 변수들은 함수의 호출이 끝나는 시점에 사라짐
함수의 실행• Command Window의 프롬프트에서 호출하거나, 다른 함수 또는 스크립트
M-file에서 함수 호출
19
MATLAB Programming
스크립트 M-file 편집 및 실행
“New Script” 아이콘 클릭하거나, Ctrl+N 키로 Editor 실행
20
MATLAB Programming
스크립트 M-file 편집 및 실행
명령어 입력, 파일 저장, 실행
21
MATLAB Programming
스크립트 M-file 실행과 Profiler
“Run and Time” 클릭 시 수행 결과와 함께 Profiler 실행
22
MATLAB Programming
함수 M–file 작성하는 두 가지 방법
방법 1) “New” “Function” 선택 방법 2) “New Script” 선택 후 Editor에서 function 헤더 직접 입력
23
MATLAB Programming
간단한 함수 M-file
Factorial 계산하는 함수• 아래와 같이 함수 작성 후 factorial.m 으로 저장
• 함수 실행을 위해 Command Window에서 다음과 같이 입력
>> factorial(5)
24
MATLAB Programming
함수 M-file의 구조
함수 몸체
함수 헤더
함수 끝
함수명입력 매개변수출력
매개변수
25
MATLAB Programming
함수 M-file의 작동 원리
함수 실행 위해 프롬프트에서 다음을 입력
• 1. Current Directory에서 factorial.m 파일이 있는지 확인• 2. factorial.m 파일이 함수 M-file인지 확인
>> a = factorial( 5 )
26
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
27
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
28
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
29
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
입력매개변수값전달
30
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
출력매개변수에결과값리턴
31
MATLAB Programming
Quiz
n-차원 공간상의 두 점을 입력 받아 두 점 사이의 맨해튼 거리와유클리디안 거리를 계산해주는 함수를 작성해 봅시다.
• Note– n-차원 공간상의 점 ≡ 1 x n 벡터– 두 점 (x1, x2, …, xn)와 (y1, y2, …, yn)의 맨해튼 거리 : |x1-y1| + |x2-y2| + … + |xn-yn|
32
MATLAB Programming
프로그램 흐름 제어 (Flow Control)
프로그램 흐름제어를 위한 statements• if, for, while, switch, continue, break
흐름 제어?• 프로그램 수행 중 조건에 따른 명령어의 분기 (if, switch)• 명령어의 반복 (for, while)• 명령어 pass (continue)• 명령어 중단 (break)
33
MATLAB Programming
if 문
Syntax
• 조건 논리식이 맞지 않으면, 그 다음 조건 논리식을 검사• 조건 논리식이 맞으면 명령어 문장을 수행하고 if문 종료
if (조건 논리식)(명령어 문장들)
elseif (조건 논리식)(명령어 문장들)
else(명령어 문장들)
end
𝑓𝑓 𝑡𝑡 =
1 , 𝑡𝑡 = 0sin(𝜋𝜋𝑡𝑡)𝜋𝜋𝑡𝑡 , 𝑡𝑡 > 0
−1 , 𝑡𝑡 < 0
if t == 0f = 1
elseif t > 0f = sin(pi*t)/(pi*t)
elsef = -1
end
조건이맞지않으면…
34
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>>
35
MATLAB Programming
Quiz
입력 변수 x의 값이 짝수인지, 홀수인지 판별하고, 짝수이면 0, 홀수이면 1을 반환하는 함수 M-file을 작성해봅시다.
• Hint– mod(a,b) 함수 : a/b를 하여 나머지를 반환하는 함수
36
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
37
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
38
MATLAB Programming
Quiz
for 문을 이용하여 황금률 𝟏𝟏+ 𝟓𝟓𝟐𝟐를 근사적으로 나타내는 다음과 같은
연속되는 분수를 계산해 봅시다.
1 +1
1 + 11 + 1
1 + 11 + 1
1 + 11 + 1
1 + 11 + 1
1 + 1
39
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
함수정의
40
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
+ …
41
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
42
MATLAB Programming
Quiz
벡터 𝑿𝑿 = 𝒙𝒙𝟏𝟏,𝒙𝒙𝟐𝟐, … , 𝒙𝒙𝒏𝒏 가 있을 때, 벡터 X의 1-norm, 2-norm, ∞-norm은다음과같이정의됩니다.
• 𝑋𝑋 1 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖• 𝑋𝑋 2 ≔ ∑𝑖𝑖=1𝑛𝑛 𝑥𝑥𝑖𝑖2
• 𝑋𝑋 ∞ ≔ max( 𝑥𝑥𝑖𝑖 )
벡터 X와 p값을입력으로받아 p-norm의값을계산하는함수를작성해봅시다. (switch 문을사용하여작성해봅시다)
• p 는 1, 2, Inf 값을 사용
43
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
에러발생시…
44
Top Related