Matlab/스크립트

위키배움터
자료 정보
진행 상황: 이 자료는 아직까지 만들어지는 중입니다. 여러분이 빨리 진행될 수 있도록 도와주세요.
교육 수준: 이 자료는 대학교 강의 수준의 자료입니다.
과목 정보: 이 자료는 공학 과목의 자료입니다.
자료 형식: 이 자료는 강의형식의 자료입니다.


스크립트란 일련의 작업들을 순서대로 진행하도록 미리 세팅해둔 것을 말합니다. 일종의 프로그램이라고 보면 됩니다. Matlab, GNU Octave에서의 스크립트는 .m 형식으로 저장되며, 언제든지 불러와서 같은 작업을 다시 실행할 수 있습니다.

스크립트 작성과 실행[편집]

GNU Octave에서 새 스크립트를 작성하려면 메뉴에서 File > New > New Script 를 클릭합니다. 그러면 Script 에디터가 나오고, 여기서 필요한 명령들을 차례로 입력할 수 있습니다. 예시로, 평균값을 구하는 스크립트를 작성해보겠습니다.

A=1; B=3; C=5;

average=(A+B+C)/3

이렇게 스크립트를 작성한 후, 상단의 저장 버튼을 눌러 원하는 경로에 저장해줍니다. 만든 스크립트를 실행하는 방법은 Script 에디터를 빠져나간 다음, 상단에 Current Directory에 해당 m 파일이 있는지 확인한 후, m 파일의 이름을 입력해주는 것입니다. 만약 Current Directory가 아닌 다른 경로에 m 파일이 있다면 우측의 Browse Directories를 눌러 경로를 옮겨주고 m 파일 이름을 입력해주면 됩니다. 위에서 작성한 간단한 script의 실행 결과는 다음과 같습니다.

>> average
average =  3

input[편집]

input을 사용하면 스크립트에서 미리 변수값을 지정해줄 필요 없이, 사용자가 원하는 값을 넣게끔 할 수 있습니다.

A=input('value A?')
B=input('value B?')
C=input('value C?')

average=(A+B+C)/3

이렇게 만들고 average1.m으로 저장한 후, 실행한다면,

>> average1
value A?4
A =  4
value B?6
B =  6
value C?9
C =  9
average =  6.3333

이렇게 A, B, C값을 물어보게 하여 평균값을 구할 수 있습니다.

disp[편집]

disp를 이용해 화면에 값이나 문자를 출력할 수 있습니다.

A=input('value A?')
B=input('value B?')
C=input('value C?')
average=(A+B+C)/3;
disp('')
disp('The average is : ')
disp('')
disp(average)

average2.m으로 저장 후 실행하면

>> average2
value A?4
A =  4
value B?6
B =  6
value C?7
C =  7

The average is :

 5.6667

disp('')를 입력하면 빈 줄을 출력합니다.

표처럼 나열하는 스크립트도 만들 수 있습니다.

yr=1984:2:1996;
pop=984:2:996;
table(:,1)=yr';
table(:,2)=pop';
disp('year population')
disp('')
disp(table)

pop으로 저장한 뒤 실행하면 결과는 다음과 같습니다.

>> pop
year population

   1984    984
   1986    986
   1988    988
   1990    990
   1992    992
   1994    994
   1996    996

fprintf[편집]

fprintf를 이용하면 텍스트와 수치값을 화면에 표시하거나 저장할 수 있습니다. 출력 형식도 따로 지정 가능합니다.

fprintf('Hello World \n\n')   % 작은 따옴표 안에 \n을 입력하면 줄바꿈합니다.
fprintf('Hi')

pop2.m으로 저장한 뒤 실행하면 결과는 다음과 같이 나옵니다.

>> pop2
Hello World

Hi>>

문자열과 함께 숫자를 나타내려면 다음과 같이 합니다.

pop=90000;
fprintf('The population is %i. \n', pop)

이것을 pop3.m이라 하고 실행하면,

>> pop3
The population is 90000.
>>

즉, 작은 따옴표 안에 % 적힌 부분에 숫자가 들어갑니다. 여기서 나오는 숫자는 반드시 fprintf의 괄호 안 끝에 쉼표(,)를 찍어서 순서대로 나열해주어야 합니다. %다음에 오는 알파벳이나 숫자는 출력 형식을 지정합니다. 예시에서 사용된 %i는 정수 형태로 표시하라는 것입니다.

출력 데이터 형식은 다음과 같이 지정할 수 있습니다.

  • %e : 소문자 e를 이용한 지수 표시법
  • %E : 대문자 E를 이용한 지수 표시법
  • %f : 고정 소수점 표시법
  • %g : e 표기법과 f 표기법 중 더 짧은 쪽으로 표시
  • %G : E 표기법과 f 표기법 중 더 짧은 쪽으로 표시
  • %i : 정수로 표시

소수점의 수도 지정해줄 수 있습니다. 예를 들어, %7.3f 라고 한다면 소수점을 포함한 일곱 자리의 수로 나타내는데, 소수점 이하 자리수는 세 자리로 나타내는 것을 의미합니다.

pop=905.3664949;
fprintf('The population is %7.3f. \n', pop)

pop4.m으로 저장한 뒤 실행하면,

>> pop4
The population is 905.366.

fprintf를 이용해 출력 값 저장하기[편집]

fprintf, fopen, fclose를 이용해 출력값을 텍스트 파일로 저장할 수 있습니다. 우선 fid라는 변수에 fopen('파일명', '권한 지정') 함수를 이용해 fid에 연 파일을 넣어줍니다. 그 다음, fid에 fprintf를 이용해 값을 적어준 후, fclose(fid)를 통해 파일을 닫아주면 됩니다.

이때 '권한 지정' 변수는 세 가지가 있는데, 기본값은 'r'입니다.

  • 'r' : 읽기 위해 파일을 연다.
  • 'w' : 쓰기 위해 파일을 연다. 파일이 이미 존재하면, 파일 내용이 삭제된다. 파일이 존재하지 않으면 새 파일을 생성한다.
  • 'a' : 파일이 존재하는 경우 출력 값이 파일 끝에 이어서 출력된다. 나머지는 'w'와 같다.
n1=1; n2=2; n3=3;
fid=fopen('testfile.txt', 'w')

fprintf(fid, 'This is the %i st message \n', n1);
fprintf(fid, 'This is the %i nd message \n', n2);
fprintf(fid, 'This is the %i rd message \n', n3);
fclose(fid);

이와같이 test.m 스크립트를 만들고 실행하면, 같은 경로에 testfile.txt가 생기며, 내용은 다음과 같이 나옵니다.

This is the 1 st message 
This is the 2 nd message 
This is the 3 rd message

관계 연산자[편집]

Matlab에서 조건문을 사용할 때 자주 쓰이는 것이 관계 연산자입니다. 관계 연산자를 통해 조건의 참, 거짓을 구분합니다. 참은 1, 거짓은 0입니다.

  • < : 우변보다 작은가
  • > : 우변보다 큰가
  • <= : 우변보다 작거나 같은가
  • >= : 우변보다 크거나 같은가
  • == : 우변과 같은가
  • ~= : 우변과 같지 않은가

주의할 점은, 수학에서 하듯이, 3<x<5와 같이 연속으로 나열하면 안 된다는 것입니다. 이렇게 하기 위해선 논리 연산자를 같이 사용해야 합니다.

논리 연산자[편집]

논리 연산자는 세 가지가 있습니다. 이 역시 조건문을 사용할 때 자주 쓰입니다.

  • & : And. A&B가 있다고 할 때, A와 B가 모두 참(1)이면 1이고, 둘 중 하나라도 거짓(0)이면 0. GNU Octave에서도 동작하나, 경고 메시지가 나오지 않게 하려면 &&를 씁니다. Matlab에서도 &&를 사용할 수 있습니다.[1]
  • | : Or. A|B가 있다고 할 때, A와 B 중 하나 이상이 참(1)이면 1이고, 둘 다 거짓(0)이면 0
  • ~ : Not. ~A가 있다고 할 때, A가 참(1)이면 0을, 거짓(0)이면 1

관계 연산자에서 주의점으로 든 3<x<5를 Matlab에서 나타내려면 3<x & x<5와 같이 써주어야 합니다.

조건문[편집]

Matlab에서의 조건문은 if, elseif, else의 세 가지 유형이 있습니다. 조건문의 마지막에는 end를 붙여주어야 합니다. if는 가장 처음에 오고, elseif는 if의 조건에 맞지 않는 경우 다시 새로운 조건으로 검토하게 합니다. else는 if나 elseif에서 걸러지지 않은 경우들을 일괄적으로 처리합니다.

반복문[편집]

Matlab에서의 반복문은 for-end와, while-end가 있습니다.

for-end[편집]

for를 사용하면 인덱스로 사용하는 변수가 증가하는 동안, 여러번 반복 계산을 할 수 있습니다. for문에서도 마찬가지로 마지막에 end를 붙여줍니다. 예를 들면 다음과 같습니다.

for k= a:b:c  % k라는 인덱스 변수가 a부터 시작해서 b씩 증가하면서 c가 될 때까지 반복 계산
...
end
예제 1

for 문을 이용해서 를 계산하시오.

S=0;

for k=1:3:10
  S=S+k^2;
  end
  
  S

for_ex1.m으로 저장했을 때 출력은 다음과 같습니다.

>> for_ex1
S =  166
예제 2

for 문을 이용해서 를 구하는 스크립트를 작성하고, n=5에 대해 실행해 보아라.

S=0;
n=input('n?');

for k=1:n
  S=S+k/2^k;
  end
  
  S

for_ex2.m으로 저장했을 때 출력은 다음과 같습니다.

>> for_ex2
n?5
S =  1.7812
예제 3

벡터 V = [5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, 2, 16]일 때, 양수이면서 3이나 5로 나누어 떨어지는 원소는 0으로 바꾸고, 음수이면서 -5보다 큰 원소는 1을 더해주는 스크립트를 만들어라.

V = [5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, 2, 16]

n=length(V);

for k=1:n
  if V(k)>0 && (rem(V(k),3)==0 | rem(V(k), 5)==0)
    V(k)=0;
  elseif V(k)<0 && V(k)>-5
    V(k)=V(k)+1;
    end
    end
    
    V

for_ex3.m으로 저장 후 실행하면,

>> for_ex3
V =

    5   17   -3    8    0   -7   12   15   20   -6    6    4    2   16

V =

    0   17   -2    8    0   -7    0    0    0   -6    0    4    2   16

while-end[편집]

while-end문은 조건식이 틀리지 않는 한, 명령을 반복하는 반복문입니다. for-end와 마찬가지로 마지막에 end를 넣어주어야 합니다.

예제 1

x=1부터 시작할 때, x가 10보다 작다면 계속 x를 세 배씩 증가시키는 스크립트를 작성하여라.

x=1;

while x<=10
  x=3*x
  end

while_ex1.m으로 저장 후 실행하면

>> while_ex1
x =  3
x =  9
x =  27

사용자 정의 함수[편집]

사용자 정의 함수란, Matlab 내에서 내장함수처럼 사용할 수 있는, 사용자가 만든 임의의 함수를 말합니다. 형식은 다음과 같습니다.

function [output_arguments] = function_name(input_arguments)

[output_arguments]에는 출력 인자들을, function_name은 만들 사용자 함수의 이름을 적어주면 되고, input_arguments에는 입력해주어야 하는 인자들을 넣어줍니다. 주의점은 m파일을 저장할 때 파일명을 function_name으로 해주어야 한다는 것입니다.

예제

화씨 온도를 섭씨 온도로 바꾸어주는 사용자 정의 함수를 만들어봅니다. 스크립트 편집기를 띄우고 다음과 같이 입력한 뒤, FtoC.m으로 저장해봅니다.

function C=FtoC(F)
C=5*(F-32)/9;

다시 Command Window로 돌아가서 변환하고 싶은 화씨온도를 함수에 입력해봅니다.

>> FtoC(200)
ans =  93.333
>> FtoC(100)
ans =  37.778

feval[편집]

스크립트 내에서 feval(f, a)를 사용하면, 함수 f에 a값을 대입한 결과를 구할 수 있습니다. 주로 다음에 설명하는 익명함수와 함께 쓰입니다.

익명함수[편집]

익명함수는 function이 들어가는 별도의 m파일을 만들지 않고, Command window에서 임시로 사용할 함수를 지정하는 것입니다. 형식은 다음과 같습니다.

name = @(입력 인자) 수학식

예를 들어 라는 함수를 익명함수로 만든다면

f = @(x) x.^3 - x.^2 + 1

이라고 한 뒤에, 예를 들어 f(1)을 계산하고자 한다면

>> f(1)
ans = -1

이렇게 해주면 됩니다.

각주[편집]

  1. https://kr.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.html

참고 자료[편집]

  • 충북대 수치해석 강의