lec 04. m-file programming

49
MATLAB Programming M-file 프로그래밍 김탁은 [email protected] 1

Upload: tak-eun-kim

Post on 15-Jun-2015

1.151 views

Category:

Education


23 download

TRANSCRIPT

MATLAB Programming

M-file 프로그래밍

김 탁 은[email protected]

1

MATLAB Programming

M-file

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

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

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

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

M-file 종류

• 스크립트 M-file

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

• 함수 M-file

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

M-file 편집기

• 일반 텍스트 편집기

• MATLAB 에디터

2

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 창에 나타나지 않음

3

MATLAB Programming

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

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

4

MATLAB Programming

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

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

5

MATLAB Programming

스크립트 M-file 실행과 Profiler

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

6

MATLAB Programming

함수 M-file

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

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

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

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

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

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

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

나타나지 않음

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

함수의 실행

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

7

MATLAB Programming

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

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

8

MATLAB Programming

간단한 함수 M-file

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

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

>> factorial(5)

9

MATLAB Programming

함수 M-file의 구조

함수 몸체

함수 헤더

함수 끝

함수명입력 매개변수출력

매개변수

10

MATLAB Programming

함수 M-file의 작동 원리

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

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

>> a = factorial( 5 )

11

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

12

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

13

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

14

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

입력매개변수값전달

15

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

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

16

MATLAB Programming

Quiz

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

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

• Note

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

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

17

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

함수정의

실행결과

18

MATLAB Programming

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

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

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

흐름 제어?

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

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

• 명령어 pass (continue)

• 명령어 중단 (break)

19

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

조건이맞지않으면…

20

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

21

MATLAB Programming

Quiz

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

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

• Hint

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

22

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

함수정의 실행결과

23

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

24

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

25

MATLAB Programming

Quiz

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

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

1 +1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 11 + 1

1 + 1

26

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

실행결과

27

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

함수정의

28

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

실행결과

29

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

+ …

30

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

31

MATLAB Programming

Quiz

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

같이정의된다.

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

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

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

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

문을꼭사용)

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

32

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 33

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

에러발생시…

34

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

35

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

36

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 37

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)

재귀호출트리

38

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 모양

39

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 모양

grule(0)grule(1)

grule(2)grule(3)

grule(4)grule(5)

grule(6)grule(7)

grule(8)grule(9)

40

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

실행결과

41

MATLAB Programming

Anonymous Function (익명 함수)

익명 함수란?

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

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

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

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

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

Syntax

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

42

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

43

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

44

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

45

MATLAB Programming

Anonymous Function (익명 함수)

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

>> t = @() datestr(now)

t =

@()datestr(now)

>> t()

ans =

16-Jan-2014 10:29:55

46

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

47

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

48

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

49