400 likes | 1.04k Views
디지털신호처리. MATLAB 의 사용. MATLAB 의 역사 및 소개. 초기 MATLAB 은 Cleve Moler 에 의해 Fortran 으로 작성 현재는 미국의 MathWork 사에 의해 C++ 로 작성 Matlab 은 Matrix 계산에 뛰어난 능력을 가지고 있으며 많은 이론의 실증 프로그램을 작성하는데 사용되고 있다 . Matlab 코딩 체계는 우리에게 친숙한 수학적인 기호와 간단한 C 문법으로 행해진다 . MATLAB 의 이용범위. 수학과 관련된 계산 알고리즘 개발
E N D
디지털신호처리 MATLAB의 사용
MATLAB의 역사 및 소개 • 초기 MATLAB은 Cleve Moler에 의해 Fortran으로 작성 • 현재는 미국의 MathWork사에 의해 C++로 작성 • Matlab은 Matrix계산에 뛰어난 능력을 가지고 있으며 많은 이론의 실증 프로그램을 작성하는데 사용되고 있다. • Matlab코딩 체계는 우리에게 친숙한 수학적인 기호와 간단한 C문법으로 행해진다.
MATLAB의 이용범위 • 수학과 관련된 계산 • 알고리즘 개발 • 상황 Modeling과 Data분석 • 여러 가지 과학과 공학적인 그래픽적 표현 • GUI에 의한 Application 개발 • 제어분야의 프로그래밍 • 네트워크 시뮬레이션
MATLAB의 기타 특징 • 행렬을 기본으로 계산하기 때문에 MATLAB의 기본 데이터 요소는 차원의 제한이 없는 Array(배열)이다. • 제어 및 이미지 프로세싱 등 여러 분야에 적용을 하기 위해 ToolBox를 제공하고 있다. • ToolBox란 신호 처리, 통계학, 영상 처리, 제어, fuzzy logic, 재정 등 여러 분야에 대한 적용 가능한 도구를 제공한다. • ToolBox는 MATLAB의 기본 제공되는 명령어들과 외부 언어로 구성이 되어있으며 제공되는 소스코드를 이용하여 사용자가 추가적인 응용을 가능하도록 지원한다. • 외부 프로그램, 즉, C, Fortran과 link해서 이용할 수 있는 mex기능도 제공하고 있다.
PATH 설정 • File/Set Path • 작성한 파일이 있는 위치를 등록하여 MATLAB에서 사용할 수 있도록 한다.
M-file • 여러 개의 함수들을 사용, 사용자의 목적에 맞는 실행 file을 만들기 위해서는 MATLAB 의 함수들로 구성된 M-file을 만들어야 한다. • M-file은 text editor(예를 들면 윈도우에 있는 notepad)를 사용하여 MATLAB 의 명령어를 차례로 입력하면 된다. • M-file “Inv_A.m”의 내용 A=[1 2 4; 3 5 6; 6 2 1] B=inv(A) • 만들어진 M-file을 실행시키기 위해서는 명령창에서 Inv_A라고 입력하고 enter를 치면 Inv_A에 포함된 명령들을 수행한다.
MATLABHelp >> help mean : Command Window에 해당 내용이 출력된다. >> lookfor covariance : more general information >> helpwin: small window, hypertext >> helpdesk: HTML browser가 뜬다.
행렬의 입력방법 • 직각 수치 행렬을 기본적인 자료의 형식으로 취급한다. • 행렬의 원소 : 실수, 복소수, 문자 • MATLAB에서 사용되는 행렬 입력방식 • MATLAB 명령창 • 내부명령 또는 함수들을 사용하여 행렬을 생성 • M-파일 내에서 행렬을 구성 • 외부의 자료 파일로부터 행렬을 불러들임(*.mat,*.dat,*.txt) • MATLAB은 다른 프로그래밍 언어들과 달리 차원의 선언이나 형선언이 필요 없다. 컴퓨터가 사용 가능한 크기까지 자동적으로 저장공간을 할당해 준다.
행렬입력 규칙 • 전체 원소들은 대괄호 [ ] 로 감싼다. • 원소들은 빈칸 또는 쉼표를 사용하여 분리한다. • 원소의 끝에 세미콜론( ; )을 붙이면 한 행의 종료를 의미한다. • Command Window에 행렬을 입력하는 예 >> A=[1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9
행렬입력: Workspace 1 3 • 더블 클릭하면 Array Editor가 활성화 된다. • Array Editor에 행렬값을 입력한다. 4 2
행렬원소 • 수치, 함수, 수식, 문자 등 : 배열 원소는 스페이스로 구별 ; 세미콜론이 없으면 입력한 내용을 실행 하고 다음 라인에 출력한다. ; 세미콜론이 있으면 입력한 내용을 실행 하고 화면에 보여주진 않는다. ; 세미콜론이 문장 안에 있으면 행을 구별한다
행렬원소: 원소 추가 or 대치 • 기존의 행렬보다 차원이 큰 범위에 원소를 삽입하면 나머지는 0이 채워지고 새로운 행렬을 생성할 때 자신의 행렬 일부를 이용하여 만들 수 있는데 이를 부행렬이라한다. • 현재 X는 1*3 행렬로 [ -2.5000 12.1825 1.5000 ] 저장되어 있다. >> x(5)=abs(x(1))x = -2.5000 12.1825 1.5000 0 2.5000 본래 있던 X행렬에 5번째 열의 값을 만들고 그 값을 abs(x(1))로 저장한다. 4번째 열은 값을 지정하지 않았으므로 0이 채워진다
행렬원소 • 작은 행렬을 이용하여 큰 행렬에 추가할 수도 있고, 반대로 할 수 도 있다. >> C = A( 2 , : ) C = 4 5 6 >> D = A( : , 3 ) D = 3 6 1 5 >> X = 0 : 0.1 : 1; >> Y = sin ( 2 * pi * X ) ; >> z=[1 3 5]; A=[A;z] A = 1 2 3 4 5 6 6 2 1 1 3 5 >> B = A( 1 , 2 ) B = 2 A행렬의 2행 모든 열 값을 C 행렬에 저장 A행렬의 모든 행,3번열 값을 C 행렬에 저장 A행렬의 1행 2열 값을 B 행렬에 저장 X행렬에 0부터 0.1 간격으로 1까지 저장. 1X11 행렬 각각의 X행렬값을 연산하여 Y행렬에 저장. 1X11 행렬
기타 행렬 표현 • MATLAB에서는 선형 대수학이나 신호 처리 분야에서 취급되는 특별한 행렬들을 생성하는 함수들을 제공한다. • compan : 동반 행렬(Companion matrix) • diag : 대각 행렬(Digonal matrix) • gallery : 시험 행렬(Test matrix) • hadamard : Hadamard행렬 • hankel : Hankel행렬 • hilb : Hilbert 행렬 • invhilb : Hilbert 행렬의 역행렬 • kron : Kronecker텐서 곱(tensor product)
기타 행렬 표현 • magic : 마방진( 각각의 행, 열, 대각선을 합한 값들이 모두 같은 행렬) • pascal : Pascal의 삼각형 • toeplitz : Toeplitz행렬 • vader : Vandermonde행렬 • 그 이외에 실용적인 행렬들 • zeros : 0만으로 구성된 행렬 • ones : 1만으로 구성된 행렬 • eye : 단위 행렬 >> k=magic(3) k = 8 1 6 3 5 7 4 9 2 >> o= zeros(3) o = 0 0 0 0 0 0 0 0 0 >> t=zeros(2,3) t = 0 0 0 0 0 0
행렬의 합과 Transpose • MATLAB은 "열 벡터"방향으로 연산한다. Transpose는 ’를사용한다. A의 행을 열로 변경 >> A = [ 1 1 1; 1 2 3; 1 3 6] A = 1 1 1 3 2 3 3 3 6 >> sum(A) ans = 7 6 10 >> k=sum(A) k = 7 6 10 >> A' ans = 1 3 3 1 2 3 1 3 6 >> e = A' e = 1 3 3 1 2 3 1 3 6
기본 산술 수식1: 선형대수 규칙 • Summation and Subtract • A + B & A – B : The same dimensions. • 해당하는 각각의 행렬 값을 더하거나 뺀다 • Product • A * B : A is m * n matrix & B is n * p matrix, • the result is m * p matrix. • Division • Left division : X = A \ B → inv(A)*B • Right division : X = A / B → A*inv(B)
기본 산술 수식1 예 >> a= [1 2; 3 4] a = 1 2 3 4 >> b= [0 1; 2 3] b = 0 1 2 3 >> c = a + b c = 1 3 5 7 >> a-b ans = 1 1 1 1 >> a * b ans = 4 7 8 15 >> inv(a) ans = -2.0000 1.0000 1.5000 -0.5000 >> inv(b) ans = -1.5000 0.5000 1.0000 0 X = A / B → A*inv(B) >> x = a/b x = 0.5000 0.5000 -0.5000 1.5000 x = a/b = a * inv(b) x(1,1) = (a11 * b11) + (a12 * a21) =(1 * -1.5) + (2 * 1) = 0.5 x(1,2) = (1 * 0.5) + (2 * 0) = 0.5 x(2,1) = (3 *-1.5) + ( 4 * 1) = -0.5 x(2,2) = (3 * 0.5 ) + (4 * 0) = 1.5
기본 산술 수식2: 배열 연산 • x. * y = [ xij * yij ] • x. / y = [ xij / yij ] • x. ^ y = [ ] • .* ./ . ^ 기호들은 각각의 배열값에만적용된다. a = 1 2 3 4 b = 0 1 2 3 >> a.*b ans = 0 2 6 12 >> a./b Warning: Divide by zero. ans = Inf 2.0000 1.5000 1.3333 >> a.^b ans = 1 2 9 64 >> a.\b ans = 0 0.5000 0.6667 0.7500
난수생성 • rand : 0과 1 사이의 값으로 균등 분포를 갖는 단일 난수를 발생 • rand(1, n) : 0과 1 사이의 값으로 균일 분포를 n개의 난수행벡터를 만든다. • rand(n) : 0과 1사이의 값으로 균등 분포를 갖는 난수들로 이루어진 nXn행렬을 만든다. >> rand ans = 0.9501 >> rand ans = 0.2311 >> a = rand(1, 4) a = 0.6068 0.4860 0.8913 0.7621 >> b = rand(2, 4) b = 0.4565 0.8214 0.6154 0.9218 0.0185 0.4447 0.7919 0.7382 >> c = rand(3) c = 0.1763 0.9169 0.0579 0.4057 0.4103 0.3529 0.9355 0.8936 0.8132 >> d = rand(3, 1) d = 0.1987 0.6038 0.2722
논리연산: 관계연산 Relational Operations의 결과 true이면 1, false이면 >> f = y > 5.0 f = 0 0 1 >> y= [ 4 5 6] y = 4 5 6 >> k = y > 3.0 k = 1 1 1
논리연산 • z = n2.*log(n2+(n2==0)); • a = n2+(n2==0); >> n2 = [3 0] n2 = 3 0 >> z = n2.*log(n2+(n2==0)) z = 3.2958 0 >> a = n2+(n2==0) a = 3 1
M-file Programming 1 • M-file : Matlab언어로 쓰여진 파일들(files) • 연속적인 Matlab문장들(명령어들)을 수행하는 script mode • 파일 이름은 어떠한 이름으로도 사용 가능 • 입력 매개변수와 출력 매개변수를 다루는 function mode • 파일의 이름은 function이름과 가능한 같게 한다 • text editor를 이용하여 M-file 작성 • command window에서 M-file을 부르거나, 다른 M-file내에서 호출 • 비교 • function : 변수가 function workspace에 등록됨. • script : 변수가 base workspace(command workspace)에 등록됨. (전역변수)
함수 작성 유의사항 • 파일 첫줄에 ‘function’이라는 단어가 있는 M-파일이 함수 파일 function 변수 = 파일이름(인자) function [Pccoeff, Pcvec] = pca(data, N) • 스크립트와의 큰 차이점은 ‘function’이 없으면 스크립트로 인식 • 파일이름의 이름으로 사용된 이름이 함수의 이름과 같아야 함 • ‘%’기호 뒤에 나오는 문장들은 주석으로 인식되어 무시 • ‘%’기호와 함께 적어 놓은 설명 부분은 MATLAB프롬프트에서 ‘help mean’이라고 입력하였을 때 화면상에 표시 • 첫 번째로 ‘%’ 기호 이후의 주석은 ‘lookfor mean’이라고 입력하면 화면에 ‘mean’이라는 단어를 포함하는 항목을 모두 표시
function 작성 • Matlab – Command Window에서 fact(2)를 해보자. • 다음과 같은 메시지가 나온다 ??? Undefined command/function 'fact'. • 작성한 후 디스크 모양의 Save를 클릭하면 저장 화면이 뜨고, 저장할 이름에 fact라고 되어 있다. • prod.m함수는 입력 매개변수로 주어진 벡터를 구성하는 각각의 원소에 대한 곱을 반환하는 함수(matlab에서 지원) text editor 실행
기본 함수 설명 • disp.m : 주어진 ‘메시지’ 문자열을 화면에 출력. • disp(‘메시지’) • rem.m : 주어진 배열 a,b에 대해 a./b를 계산하여 나머지들을 반환한다. • Y = rem(a, b) • fix.m : 주어진 배열 X의 원소들의 소수부분을 제거하고 정수로만 이루어진 배열을 만든다 • Y = fix(X)
Flow Control : if/switch case • 임의의 벡터 x가홀/짝수를 구별하는 exe_fc.m함수를 작성한다. • 입력이 없으면 error 메세지 출력
Flow Control : for for 변수=시작값:증가분:최종값 < 실행문> end k = i+2 는 어떤 결과가 나올까?
Flow Control : while while 논리적인 조건 < 실행문> end • n!의 결과가 100을 넘어가기 전의 “n!’의 “n”을 구하시오 % disp대신 sprintf로 변경한 결과
Flow Control • C언어에서와 동일한 break, continue, return 명령어 지원 • try, catch : 예외 처리 기능 • try 다음에 나오는 명령문중에서error가 발생하면실행을 중단하고 , catch뒤에 나오는 명령문을 실행한다. catch에서도 error가 발생하면 제어권을 matlab command window로 돌려준다. • 일종의 변형된 if/else문이다 try < 명령문 1> < 명령문 2> … catch < 명령문 3> … end
Data Types : 다차원 배열 • 2, 3, 4차원 배열 등의 다차원 배열 사용 가능 • 3차원 배열 예 • 다차원 배열을 만드는 함수들 • ones.m, zeros.m, rand.m, randn.m, cat.m, reshpae.m, repmat.m등
Plot 1 • Line Plots : plot.m, ploty.m, loglog.m etc • Bar Plots : bar.m, barh.m etc • Scatter Plots • Pie Charts • Contour Plots 와 Mesh • plot3와 surf
Plot 2 % 그래프가 그려진 후 다음 명령을 실행해보자. % 어떤 변화가 발생하는가? >> xlabel('test plot x') >> ylabel('test plot y'); >> title('plot 연습') 선 지정 : 빨간 쇄선, 별마크
Plot 3 • Grid : 그래프의 눈금 표시에서의 격자를 설정․해제한다. • Box : 축 상자를 설정․해제한다. • 제목과 축의 라벨들은 title, xlabel, ylabel을 사용하여 첨가 • text(x,y,S) : 좌표 (x,y)에 문자열 S를 첨가한다. • Gtext : 마우스를 사용하여 대화식으로 텍스트를 첨가 • axis([xminxmaxyminymax])는 현재의 그래프의 비율을 주어진 값으로 설정 • hold on : 현재의 그래프에 그래프를 더 추가 (cf. hold off) • figure : 다중 그림창을 생성. figure(n)은 n번째의 그림창을 활성화함. • 하나의 figure는 subplot 명령을 사용하여 나뉘어 질 수 있음. • zoom on으로 설정해 두면, 마우스로 그림창을 확대할 수 있음.
fplot • fplot명령은 y = f(x) 형태인 함수 값을 지정된 한계 사이에서 그래프를 정확하게 그려주는 명령 • y = x^2 + 4*sine(2x) -1 그래프 그리기 fplot(‘function’, limits, line specifiers)