190 likes | 492 Views
MATLAB Programming. Young-Ho Kim Department of Physics Kangwon National University. • Branching • More about Loops • Other Programming Commands • Interacting with the Operating System. • 매트랩에서 M-files 출력하거나 편집하기 type absval absval 파일명을 갖는 M-file 의 내용을 출력한다 .
E N D
MATLAB Programming Young-Ho Kim Department of Physics Kangwon National University • Branching • More about Loops • Other Programming Commands • Interacting with the Operating System
• 매트랩에서 M-files 출력하거나 편집하기 type absval absval 파일명을 갖는 M-file의 내용을 출력한다. edit absval absval 파일명을 갖는 M-file을 편집할 수 있다.
• 비교연산자 [ < , <= , > , >= , == , ~= ] • 논리연산자 [ 1 (TRUE) , 0 (FALSE)] [&(AND) , |(OR) , ~ (NOT) ] >> 2 > 3 ans = 0 >> [1 2 3] < [2 2 2] ans = 1 0 0 >> x = -2:2; x >= 0 x = [-2 –1 0 1 2]; x 는 0 이상이다 ans = 0 0 1 1 1 • and 나 or 에 따른 참 거짓 예)>> 0 & 0 >> 0 & 1 >> 1 & 0 >> 1 & 1 ans = ans = ans = ans = 0 0 0 1 >> 0 | 0 >> 0 | 1 >> 1 | 0 >> 1 | 1 ans = ans = ans = ans = 0 1 1 1
Branching Branching with if • y = |x| function y = adsval(x) if x >= 0 x 가 0 이상이면 y = x; y = x 로 한다. else 그렇지않으면 (x가 0 이상이 아니면) y = -x; y = -x 로 한다. end • sgn(x) = 1 x>0 0 x=0 -1 x<0 function y = signum(x) y = x / |x| if x > 0 x 가 0 보다 크면 y = 1; y 는 1 이다. elseif x == 0 x 가 0 이면 y = 0; y 는 0 이다. else 그렇지않으면 (x가 0 보다 크지 않고 0 이 아니면) y = -1; y 는 –1 이다. end
Branching with switch • switch문은 여러 개의 if-elseif 를 사용하는 경우와 비슷하다. 예) Function y = count(x) Switch x Case 1 x 값이 1이면 y = ‘one’; Case 2 x 값이 2이면 y = ‘two’; Otherwise 그렇지 않으면 y = ‘many’; end X 의 값에 따라 다른 문장을 실행시켜준다. Function y = count(x) If x == 1 y = ‘one’; Elseif x == 2 y = ‘two’; Else y = ‘many’; end
More about Loops • While - 조건에 맞을 때까지 명령문들을 수행한다. >> n=0; sum=0; while n < 100 조건 ( n이 100 미만까지 ) n=n+1; n은 1씩 늘려준다 (결과적으로 100까지) sum=sum+n; sum은 sum+n 을 해준다.(마지막은 1~99까지의 합에 +100) end >> disp([n sum]); 100 5050 결과값을 출력 • For – 범위를 지정해주어서 좀더 직관적으로 반복제어를 할 수 있다. >> for i=1:10 1:10 ( 1:1:10 과 같다. 1씩 증가한다는 것은 생략가능 ) j=i^2; disp ([i j]); end 1 1 2 4 3 9 i를 1부터 10까지 증가하면서 재곱을 계산한다. : : 10 100
• Breaking from a loop >> for i=1:10 j=i^2; if(i==7), break ,end 여기서 end 는 if문의 end이다. disp([i j]); end end 는 for문의 end 이다. 1 1 2 4 3 9 4 16 i 가 7이 되면 연산을 멈춘다. 5 25 결과값은 i 가 6 일 때까지의 값이 나온다. 6 36
Other Programming Commands •Subfunctions function y=sumabs(x) y=sum(abs(x)); % ---- subfunction starts here. function z=abs(x) subfunction z=abs(x); end >> sumabs([-3 4 5 -7]) ans = 19 Subfunction 은 function M-file 에서만 사용된다.
• 입출력인자 숫자 정하기(nargin, varagin, nargout, varagout) 1.nargin function s=add1(x,y,z) if nargin < 2 입력인자를 1개 준다면 error('At least two input arguments are required.') end if nargin == 2 s = x + y; else s= x + y + z; end >>add1(1) ??? Error using ==> add1 At least two input arguments are required. >>add1(2,3) >>add1(-100,4,6) ans = ans = 5 -90
2.varargin function s=add2(varargin) s = sum([varargin{:}]); >>add2(10,3,4,5,10) >>add2(1:10) ans = ans = 32 55 function s=add3(varargin) if ~isnumeric([varargin{:}]) isnumeric 은 뒤에 숫자가 오면 1(참) 이 된다. error('Inputs must be floating point number.') end s = sum([varargin{:}]); >>add3([1,2,3,’a’]) >>add([1,2,3]) ??? Error using ==> add3 ans= Inputs must be floating point number. 6
3.nargout function [x, y] = rectangular1(r, theta) x = r.*cos(theta); y = r.*sin(theta); >>z = rectangular1(3,pi) >>[x, y] = rectangular1(3,pi) z = x = -3 -3 인자를 하나로 하면 천번째 인자(x) y = 만 출력한다. 3.6739e-016 function [x, y] = rectangular2(r, theta) x = r.*cos(theta); y = r.*sin(theta); if nargout < 2 x = x + i*y; end >>z = rectangular2(3,pi) >>[x, y] = rectangular2(3,pi) x = z = -3 -3.0000 + 0.0000i y = 3.6739e-016
•User Input and Screen Output <화면에 출력되는 명령> 1. error 가 나면 error 가 출력된다. Error: Missing operator, comma, or semicolon. 2.warning 은 주의해야 할 일이 일어났을 때 정해진 message를 화면에 출력한다. Warning off 를 하면 warning를 나타내지 않을 수 있다. 3. Disp >> x= 2+2; disp(['The answer is ' num2str(x) ' '.']) The answer is 4 disp는 인자를 문자로 해야 한다. num2str(x) – num 을 str 로 바꿔준다.
Input 명령을 써서 계산을 계속할 것인지 묻는다. no를 입력하면 종료된다. <pause 인 경우> >> absval(0) absval ;continue(yes/no)?yes 아무 키나 누르면 계속 진행된다. ans = 0 <keyboard 인 경우> >> absval(-1) absval ;continue(yes/no)?yes K>> return return을 누르면 ans = 계속 진행된다. 1 <키보드로 쓰는 명령>(input,pause,keyboard) function y = absval(x) answer = input([‘absval;’,… ‘continue(yes/no)?,’s’); if isequal(answer,’no’) return end if x > 0 y = x; elseif x == 0 pause 정지시켜준다. y = 0; else keyboard k>>가 생긴다. y = -x; End
<마우스로 찍은 point> ginput function xmarksthespot if isempty(get(0,'CurrentFigure')) 그래프가 없으면 error('No current figure.') error 메시지가 뜬다. end flag = ~ishold; flag. Hold on -> false(0) Hold off -> true (1) if flaq hold on hold on 을 하는 것 end disp('Click on the point where you want to plot an X.') [x, y] = ginput; 마우스로 찍은 여러 점의 위치가 저장된다. ginput(1)은 한 점의 위치가 저장된다. plot(x,y, 'xk') 찍은점은 x 모양 검정색(k)으로 찍힌다. if flag hold off 그렸으면 hold off 한다. End
>> xmarksthespot 그래프가 없으면 error 가 된다. ??? Error using ==> xmarksthespot No current figure. 앞에서 주어진 error 가 뜬다. >> ezplot y=x y = x 그래프를 그린다. >> xmarksthespot Click on the point where you want to plot an X. (point를 찍고서 enter을 치면 그래프에 검정 x 가 표시된다.)
• Evaluation (값 구하기) 1. eval – eval(str)형식으로 쓴다. eval(‘sin(1)’) = sin(1) >> eval('sin(pi/2)') >>sin(pi/2) ans = ans = 1 1 2. feval – feval(‘func’,인자) 형식으로 쓴다. function final = iterate(func,init,num) final = init; for n = 1:num loop 1부터 num 번 돌린다. final = feval(func,final); end >> iterate(‘sum',1:10,1) ans = 55
1.dbstop - 원하는 위치에서 멈춘다 (형식은 >>dbstop in 함수 at 줄 ) >> dbstop in absval at 5 >> absval(-3) K>> return ans = 3 2.dbclear - 멈춘것을 지운다. (형식은 >>dbclear in 함수 ) >> dbclear in absval • Debugging function y = absval(x) if x >= 0 y = x; else y = -x; end
Interacting with the Operating System •외부 program 실행하기 1. ! 표 이용하기 !dir 도스에서 dir 한다. ex) cd,delete,type 등 2. Dos 명령 [stat, data]=dos(‘프로그램 인자’) >> [stat,data]=dos(‘프로그램 인자') stat = 상황을 나태낸다. (0이면 정상적으로 처리된 것임) 0 data = string으로 화면에 출력한다. (standard output)
•File Input and Output <Ascii text file – binary file> Workspace 와 disk file 사이에 변수 값을 변환하는데 save 와 load 를 사용한다. 파일확장자가 .mat 로 표시되어진 것은 MATLAB binary format에 쓰거나 읽을 수 있다. 줄의 끝에 ascii 를 써서 유효숫자 8자리로되어진 text를 save 명령으로 저장한다. ascii double 을 쓰면 유효숫자 16자리 text로 저장된다. 파일명 끝에 .mat 아니면 문서형식으로 가정하고 load 한다. < fopen – fout > X=0:.1:1; y=[x; exp(x)]; fout = fopen (‘exp.txt’,’w’); r =읽기 w =쓰기 a=추가 fprintf(fout, ’%6.2f %12.8f\n’, y) \n은 줄넘김 fclose(fout) %6.2f = 6은 전체 자리수, 2는 소수점 이하 자리수를 나타낸다. C:\MATLAB6p5\work 에 exp.txt 파일을 만들어 결과값을 저장한다.