[matlab] 2.matlab의 기초 문법(2)


M-file 만들기



MATLAB을 이용하여 원하는 기능을 수행하는 방법은 크게 두 가지로 구분됩니다.

첫 번째는 Command Window에 직접 명령어를 입력하는 방법이고,

두 번째는 스크립트(Script)파일을 이용하는 것입니다.

MATLAB에서 사용하는 파일을 보통 M-file이라고 부르며 파일의 확장자는 .m으로 저장됩니다.

스크립트 파일은 여러 개의 명령어가 저장된 파일이며, 순차적으로 실행됩니다.


스크립트 파일 명이 ex.m이라고 하면,


Command Window에서 스크립트 파일을 실행하려면 F5를 누르거나,


다음과 같이 입력합니다.

 >>ex

스크립트 파일을 수정 시에는 다음과 같이 입력합니다.

 >>edit ex.m



스크립트를 이용하여 코드를 작성하는 것이 편하고, 수정도 쉽습니다!



for ~ end 문



matlab도 다른 언어와 같이 반복문과 조건문이 존재합니다.

for 변수명=초기값:(증분:)최종값
	문장
end



예를 들어 1부터 10까지 홀수들의 합을 구하는 코드를 작성해보겠습니다.


s=0 % sum이라고 하면 안 됩니다. sum이라는 함수이름이 존재하기 때문입니다.
for x=1:2:10 % x는 1부터 10까지 2씩 증가한다.
	s=s+x;
end
s



if ~ else ~ end 문



if 조건 1
   문장 1
elseif 조건 2
   문장 2
else
   문장 3
end



예를 들어 2차방정식이 주어졌을 때 근을 구하는 코드를 작성해 보겠습니다.


a=1; b=2; c=3; % ax^2+bx+c=0
D=b^2-4*a*c; % 판별식

if D>0
	x1=(-b+sqrt(D))/(2*a); x2=(-b-sqrt(D))/(2*a);
elseif D==0
	x1=-b/(2*a); x2=-b/(2*a);
else
	x1=(-b+sqrt(-D)i)/(2*a); x2=(-b-sqrt(-D)i)/(2*a);
end
x=[x1 x2];
x



while ~ end문



while 조건
   문장
end



예를 들어서 1부터 100보다 작은 수 중에 소수를 판별하여

배열로 출력하는 코드를 작성해보겠습니다.




A=[];
N=100;
i=1;
while i<N
	if isprime(i) % isprime은 소수인지 판별해주는 MATLAB 내의 함수
		A=[A i];
	end
	i=i+1;
end
A



다음과 같이 배열에 원소를 추가할 수도 있습니다.


N=100;
i=1;
j=1;
while i<N
	if isprime(i) 
		A(1,j)=i;
		j=j+1;
	end
	i=i+1;
end



linspace 문



‘linspace’는 a와 b사이의 간격이 동일한 n개의 성분을 갖는 벡터를 만드는데 사용됩니다.

linspace(a,b,n)
linspace(시작점,끝점,점의 총수)



linspace는 구간을 나눌 때 용이한 함수입니다.

예를 들어보겠습니다.


 >>x=linspace(0,5,6)
 x = 0   1   2   3   4   5



이번에는 101부터 -2씩 감소 시켜 100개의 성분을 갖는 벡터를 만들어 보겠습니다.


linspace(101,-97,100) % 101부터 -97까지 100등분 하면 -2가 됩니다.



MATLAB에서 미리 정의해 둔 변수



i,j : 허수 단위를 나타냅니다. 

따라서 for문을 쓸 때 index를 i를 사용하는 경우가 많은데 조심하여야합니다.


NaN : 숫자가 아님, Not a Number의 약자로써 부정 혹은 불능 값을 나타냅니다.

예를들어 0/0이나 Inf/Inf 그리고 Inf-Inf 값이 NAN이 됩니다.


Inf : 무한대


pi : 원주율 



function



matlab도 다른 언어와 마찬가지로 반환 값이 있는 함수가 존재하는데요~

스크립트 파일명과 함수 명을 같게 저장해서 함수를 정의할 수 있습니다.(함수 M파일)

예를들어서 아까 MATLAB 내부에 정의된 함수인 isprime을 function을 이용해서

저희가 정의해보겠습니다.


function y=my_isprime(n)
if n==1
	y=false;
	return
end
for i=2:sqrt(n)
	if mod(n,i)==0
		y=false;
		return
	end
end
y=true;
return



주의할 점은 다른 언어와 다르게 세미콜론(;)은 오로지 출력을 하지 않는 용도로 쓰이는 겁니다.

그러므로 return 등에 ;을 붙이면 안 됩니다.

함수에 대해 좀 더 익숙해지기 위해 예를 하나 더 들어보겠습니다.

이번에는 어떤 수의 약수를 배열로 반환하는 코드를 작성해 볼까요?


function A=divisor(n)
A=[];
for i=1:1:n
	if mod(n,i)==0
		A=[A i];
	end
end
return



저희가 만든 함수가 잘 동작하는지 Command Window에서 확인해보겠습니다.


 >>my_isprime(3)
 1

 >>divisor(8)
 A = 1   2   4   8



inline 함수



단순히 인자를 대입하여 계산하는 함수는 function을 이용하기보다는

inline 함수를 사용하는 것이 편리하고 좋습니다.

%inline 함수

f=inline('x^3+2*x+1','x');

 >>f(1)
 ans = 4

%C++의 인라인 함수처럼 단순 치환 형태입니다~



eval을 이용해도 위와 동일한 결과를 얻을 수 있습니다.

%eval

f='x^3+2*x+1'; x=2;
eval(f)



find



find를 이용하면 주어진 조건을 만족하는 index를 손쉽게 찾을 수 있습니다.

x=[1 2 3 5 8]; y=[0 2 1 4 9];
find(x<=y)

%프로그램 실행 결과

ans = 2   5    % x의 2번째,5번째 원소가 y의 2번째,5번째 원소보다 작으므로 그 인덱스 출력



인덱스를 이용하여 값에도 접근할 수 있습니다.


 >>x(5)
 ans = 8



파일 입출력



MATLAB은 외부의 파일에 데이터를 쓰고 가져올 수도 있습니다.

fp=fopen('test.m','w');   % test.m란 파일을 쓰기용으로 생성
fprintf(fp, '%d %d\n',1,2);  % 파일에 1 2 쓰기
fprintf(fp, '%f %f\n,3.5,4.5); % 파일에 3.5 4.5 쓰기
fclose(fp); %파일 close



C언어의 파일입출력과 비슷하기에 익숙합니다~

파일을 꼭 열었으면 닫아주셔야합니다~



추가적인 내용



matlab에서도 논리 연산(AND,OR)이 가능한데, 실수벡터 또한 논리 연산이 가능합니다.

x=[1 0 0]; %실수 벡터

x=logical(x); %논리 벡터로 변환

y=logical([0 1 1]);

 >>x&y  %AND 연산
 ans = 0   0   0

 >>x|y %OR 연산 
 ans = 1   1   1



matlab에서 모르는 함수는 도움말을 통해 알아볼 수 있습니다.

for문을 이용하는 것은 시간이 많이 걸리기 때문에,

도움말을 통해 matlab 내장함수가 있는지 꼭 확인해야합니다.


% for 문에 열 벡터도 들어갈 수 있습니다.

for I=eye(4,3)
	disp(I)  %disp는 인자를 그대로 출력시키는 함수입니다.
end

% eye의 열을 차례대로 출력하게 됩니다. 

 I = 
      1
      0
      0
      0
      
 I = 
      0
      1
      0
      0
      
I = 
      0
      0
      1
      0


% find 함수 이해

 >>x=[1 0 2;0 1 1;0 0 4]
 x = 
      1   0   2
      0   1   1
      0   0   4

 >>k=find(x) % x의 열부터 차례대로 0이 아닌 값이 있는 인덱스를 출력합니다.
 k = 
     1
     5
     7
     8
     9 


% 0이 있는 인덱스를 찾고 싶으면 다음과 같이 입력합니다.

 >>find(~x); or find(x==0);



이렇게 matlab의 기초 문법에 대해 알아봤는데요~ 학교 진도를 나가면서 이어서 포스팅 하겠습니다~~~

화이팅입니다~!