이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

스크립트와 함수

개요

MATLAB®에서는 강력한 프로그래밍 언어는 물론 대화형 방식의 계산 환경까지 제공합니다. MATLAB 명령줄에서 한 번에 하나씩 명령을 입력할 수도 있고, 일련의 명령을 파일에 작성한 다음 MATLAB 함수처럼 실행할 수도 있습니다. MATLAB 편집기나 다른 텍스트 편집기를 사용하여 자신만의 고유한 함수 파일을 만들 수 있습니다. 또한 이렇게 만든 함수를 다른 MATLAB 함수나 명령처럼 호출할 수도 있습니다.

프로그램 파일에는 다음 두 가지 유형이 있습니다.

  • 스크립트 - 입력 인수를 받거나 출력 인수를 반환하지 않으며, 작업 공간의 데이터를 기반으로 동작을 수행합니다.

  • 함수 - 입력 인수를 받고 출력 인수를 반환할 수 있습니다. 내부 변수는 해당 함수 내에서만 유효한 로컬 변수입니다.

MATLAB을 처음 사용하는 프로그래머인 경우 일단 현재 폴더에서 시험해 볼 프로그램 파일을 만들어 봅니다. 자신만의 고유한 파일을 더 많이 개발해 감에 따라 MATLAB 검색 경로에 다른 폴더와 개인 툴박스를 추가하고, 이 파일들을 정리하고 싶을 것입니다.

함수 이름을 중복해서 사용하는 경우 MATLAB에서는 검색 경로에 먼저 나타나는 함수를 실행합니다.

프로그램 파일(예: myfunction.m)의 내용을 보려면 다음을 사용하십시오.

type myfunction

스크립트

스크립트를 불러오는 경우 MATLAB에서는 단순히 스크립트 파일에 있는 명령을 실행합니다. 스크립트는 작업 공간에 있는 기존 데이터를 기반으로 동작을 수행할 수도 있고, 수행할 동작의 기반이 되는 새 데이터를 생성할 수도 있습니다. 스크립트는 출력 인수를 반환하지 않지만 스크립트를 통해 생성되는 변수는 이후의 계산에 사용될 수 있도록 작업 공간에 그대로 남게 됩니다. 또한 스크립트는 plot 같은 함수를 사용하여 그래픽 출력값을 생성할 수 있습니다.

예를 들어, 다음 같은 MATLAB 명령이 포함되어 있는 magicrank.m이라는 파일을 만들어 보겠습니다.

% Investigate the rank of magic squares
r = zeros(1,32);
for n = 3:32
   r(n) = rank(magic(n));
end
bar(r)

다음 명령문은

magicrank

MATLAB에서 명령을 실행하고, 처음 30개 마방진의 랭크를 계산하고, 계산 결과를 막대 그래프로 플로팅합니다. 파일의 실행이 완료되면 변수 n과 변수 r은 작업 공간에 그대로 남습니다.

함수

함수는 입력 인수를 받고 출력 인수를 반환할 수 있는 파일입니다. 파일 이름과 함수 이름은 같아야 합니다. 함수는 자신만의 고유한 작업 공간 내 변수를 가지고 동작하는데, 이 작업 공간은 MATLAB 명령 프롬프트에서 액세스하는 작업 공간과는 별개입니다.

rank를 통해 이에 대한 좋은 예를 살펴볼 수 있습니다. 파일 rank.m은 다음 폴더에 있습니다.

toolbox/matlab/matfun

다음을 통해 이 파일을 확인할 수 있습니다.

type rank

파일 내용은 다음과 같습니다.

function r = rank(A,tol)
%   RANK Matrix rank.
%   RANK(A) provides an estimate of the number of linearly
%   independent rows or columns of a matrix A.
%   RANK(A,tol) is the number of singular values of A
%   that are larger than tol.
%   RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.

s = svd(A);
if nargin==1
   tol = max(size(A)') * max(s) * eps;
end
r = sum(s > tol);

함수의 첫 번째 라인은 키워드 function으로 시작합니다. 첫 번째 라인에서 함수 이름과 인수의 순서를 알 수 있습니다. 이 함수의 경우 최대 두 개의 입력 인수와 하나의 출력 인수를 갖습니다.

첫 번째 빈 라인 또는 실행 가능한 라인까지 그 다음 이어지는 여러 개의 라인은 도움말 텍스트를 제공하는 주석 라인입니다. 이 라인들은 다음을 입력하면 출력됩니다.

help rank

도움말 텍스트의 첫 번째 라인은 H1 라인이며, 이 라인은 MATLAB에서 lookfor 명령을 사용하거나 폴더에 대해 help를 요청할 때 표시됩니다.

파일의 나머지 부분은 함수를 정의하는 실행 가능한 MATLAB 코드입니다. 함수 본문에 정의된 변수 s, 첫 번째 라인의 변수인 r, A, tol은 모두 해당 함수 내에서만 유효한 로컬 변수이며, MATLAB 작업 공간에 있는 변수와는 별개입니다.

이 예제에서는 다른 프로그래밍 언어에서는 흔히 볼 수 없는 MATLAB 함수의 고유한 특성인, 가변적인 개수의 인수 사용 예를 보여줍니다. rank 함수를 여러 다른 방식으로 사용할 수 있습니다.

rank(A)
r = rank(A)
r = rank(A,1.e-6)

많은 함수가 이러한 방식으로 동작을 수행합니다. 출력 인수를 제공하지 않으면 결과가 ans에 저장됩니다. 두 번째 입력 인수를 제공하지 않으면 함수는 디폴트 값을 계산합니다. 함수의 본문 내에서는, 함수가 특별한 용도로 사용될 때마다 필요한 입력 인수의 개수와 출력 인수의 개수를 알려 주는 narginnargout이라는 두 개의 수량 변수를 사용할 수 있습니다. rank 함수는 nargin을 사용하지만 nargout을 사용할 필요는 없습니다.

함수의 유형

MATLAB에서는 프로그래밍에 사용할 수 있는 여러 가지 다양한 유형의 함수를 제공합니다.

익명 함수

익명 함수는 단일 MATLAB 명령문 내에 정의되는 단순한 형태의 MATLAB 함수로, 단일 MATLAB 표현식과 임의 개수의 입력 인수와 출력 인수로 구성됩니다. 익명 함수는 MATLAB 명령줄에서 바로 정의할 수도 있고 함수나 스크립트 내에서 정의할 수도 있습니다. 간단한 함수를 만들 때는 파일을 따로 만들 필요 없이 익명 함수를 사용해 신속하게 생성할 수 있습니다.

표현식으로 익명 함수를 생성하는 데 사용되는 구문은 다음과 같습니다.

f = @(arglist)expression

아래의 명령문은 한 숫자의 제곱을 찾는 익명 함수를 만듭니다. 이 함수를 호출하면 MATLAB은 변수 x에 전달할 값을 할당한 후 방정식 x.^2x를 사용합니다.

sqr = @(x) x.^2;

sqr 함수를 실행하려면 다음과 같이 입력하십시오.

a = sqr(5)
a =
   25

메인 함수와 로컬 함수

익명 함수가 아닌 함수는 파일 내에서 정의해야 합니다. 이러한 각 함수 파일에서는 메인 함수가 필수적으로 먼저 오고 임의의 개수로 구성된 로컬 함수가 메인 함수 뒤에 옵니다. 메인 함수는 로컬 함수보다 넓은 범위를 갖습니다. 즉, 메인 함수는 MATLAB 명령줄 또는 다른 파일의 함수 같이 해당 함수를 정의하는 파일의 범위를 벗어난 위치에서도 호출할 수 있지만 로컬 함수는 그럴 수 없습니다. 로컬 함수는 메인 함수와 해당 파일 내의 다른 로컬 함수에서만 사용할 수 있습니다.

함수 섹션에 나와 있는 rank 함수는 메인 함수의 한 예입니다.

프라이빗 함수

프라이빗 함수는 메인 함수의 한 유형으로, 제한된 다른 함수 그룹에서만 사용이 가능하다는 독특한 특징이 있습니다. 이 함수 유형은 함수에 대한 액세스를 제한하려고 하거나 함수의 구현을 노출하지 않으려는 경우에 유용할 수 있습니다.

프라이빗 함수는 private이라는 이름의 하위 폴더에 지정되며, 상위 폴더의 함수에서만 사용할 수 있습니다. 예를 들어, 폴더 newmath가 MATLAB 검색 경로에 있다고 가정하겠습니다. private이라는 newmath의 하위 폴더에는 newmath에 있는 함수만 호출할 수 있는 함수가 포함될 수 있습니다.

프라이빗 함수는 상위 폴더 외에서는 확인할 수 없으므로 다른 폴더에 있는 함수와 동일한 이름을 사용할 수 있습니다. 이는 원래의 특정 함수는 다른 폴더에 유지하면서 자신만의 고유한 함수 버전을 만들려는 경우에 유용합니다. MATLAB에서는 프라이빗 함수를 표준 함수보다 먼저 검색합니다. 따라서, test.m이라는 퍼블릭 파일보다 test.m이라는 프라이빗 함수를 먼저 찾습니다.

중첩 함수

다른 함수의 본문 내에 함수를 정의할 수 있습니다. 이러한 함수는 바깥쪽 함수 내에 중첩된 것으로 간주됩니다. 중첩 함수에는 다른 함수 성분의 전부 또는 일부가 포함됩니다. 이 예제에서 함수 B는 함수 A에 중첩되어 있습니다.

function x = A(p1, p2)
...
B(p2)
   function y = B(p3)
   ...
   end
...
end

다른 함수와 마찬가지로 중첩 함수도 해당 함수에 사용되는 변수가 저장되는 자체 작업 공간을 가집니다. 그런데 중첩 함수는 바깥쪽 함수 작업 공간에도 액세스할 수 있습니다. 따라서 가령 메인 함수에 의해 값이 대입되어 있는 변수를, 메인 함수 내에서 임의의 수준에 중첩되어 있는 함수가 읽거나 덮어쓸 수 있습니다. 마찬가지로, 중첩 함수에 할당되어 있는 변수를 이 중첩 함수를 감싸는 다른 함수에서 읽거나 덮어쓸 수 있습니다.

전역 변수

두 개 이상의 함수에서 하나의 변수 복사본을 공유하도록 하려면 해당 변수를 모든 함수에 대한 global로 선언해야 합니다. 기본 작업 공간에서 변수에 액세스하도록 하려는 경우에도 명령줄에서 이와 동일한 작업을 수행하면 됩니다. 전역 선언은 반드시 변수가 함수에서 실제로 사용되기 전에 이루어져야 합니다. 꼭 필요한 것은 아니지만 전역 변수 이름에 대문자를 사용하면 전역 변수를 다른 변수와 구별하는 데 도움이 됩니다. 예를 들어, falling.m이라는 파일에 새 함수를 만들어 보겠습니다.

function h = falling(t)
global GRAVITY
h = 1/2*GRAVITY*t.^2;

그런 후 다음 명령문을 대화형 방식으로 입력합니다.

global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');

두 전역 명령문에 의해 명령 프롬프트에서 GRAVITY에 대입된 값을 함수 내에서 사용할 수 있게 되었습니다. 즉, 파일을 편집하지 않고 GRAVITY를 대화형 방식으로 수정할 수 있게 된 것입니다.

명령 구문과 함수 구문

괄호와 따옴표 없이 문자 인수를 받는 MATLAB 함수를 작성할 수 있습니다. 즉, MATLAB에서는 다음을

foo a b c

아래와 같이 해석합니다.

foo('a','b','c')

하지만 따옴표가 없는 명령 형식을 사용할 경우 MATLAB에서는 출력 인수를 반환할 수 없습니다. 예를 들어, 다음은

legend apples oranges

applesoranges를 레이블로 사용하여 플롯에 범례를 생성합니다. legend 명령에서 출력 인수를 반환하도록 하려는 경우라면 반드시 따옴표가 붙은 형식을 사용해야 합니다.

[legh,objh] = legend('apples','oranges');

또한 인수들 중 하나라도 문자형 벡터가 아니라면, 문자형 벡터 인수에는 반드시 따옴표를 붙여야 합니다.

주의

따옴표가 없는 명령 구문이 편리하고 MATLAB에서 오류를 생성하지 않을 수 있으나, 경우에 따라 따옴표가 없는 명령 구문의 사용이 올바르지 않을 수 있습니다.

코드에서 문자 인수 생성하기

따옴표가 붙은 함수 형식을 사용하면 코드 내에서 문자 인수를 생성할 수 있습니다. 다음 예제에서는 August1.dat, August2.dat 같은 여러 데이터 파일을 처리하게 됩니다. 여기서는 파일 이름 작성을 위해, 정수를 문자로 변환하는 함수 int2str이 사용됩니다.

for d = 1:31
   s = ['August' int2str(d) '.dat'];
   load(s) 
   % Code to process the contents of the d-th file
end