프로그래밍언어/MATLAB

[MATLAB] 자주쓰는 기능들

long_kw 2010. 10. 14. 20:05

오랜만에 친구부탁으로 MATLAB를 써보았다.

학부때에는 그래도 간단한 기능을 금방구현하고 했었는데 어제는 새벽 3시까지 …..

공부를 열심히 해야겠다.

   

   

아래 글들은 인터넷에서 긁어온 글인데 MATLAB를 썼었던 사람들한테는 remind하기

참 좋은 자료인 것 같다.

   

*** 직접연산 아닌 여러가지 기능들

   

    %m 파일 처음에 넣으며 깨끗하게 하는 거

    clear all;  %clear 변수명 하면 그 변수 지워짐

    close all; clc;

   

    *clear - 선언한 변수들 지우기

    *close - 닫기

    *clc - 명령창 깨끗하게

   

    whos %지금 있는 변수 들 보기

   

   

   

***행렬(matrix) 선언

   

    a=[0 2; 4 3];   ->2*2 행렬    

   

    a=[0 2; ...

         4 3]          ->...을 사용하여 이렇게도 가능

   

    b=[a [0;1]; [0 0] 1];    ->이런식으로 가능.

    *결과 -> 0 2 0

                 4 3 1

                 0 0 1

   

    x=0:-2:-5  %0, -2, -4 하는 식으로 만들어짐.  범위와 증분

    x=1:0  %빈 벡터 만들어짐

    linspace(0,pi,10)  %0부터 pi까지 균등한 간격의 점을 10개 만들어 낸다

   

   

   

***행렬 원소 접근하기

   

    a(1,1)  %행과 열로 접근

   

   

   

***행렬 관련 연산

   

    역행렬 - inv(a);

    랜덤행렬 - rand(m);    rand(m,n)  %0과 1 사이 값, m 크기의 정방행렬과 m*n 크기의 행렬, 

    determenent - det(a);

    rank - rank(a);

    전치, transpose y=[1 3 2 0]`

    벡터에서 특정 원소 제거하기  a=[1,2,3,4,5,6,7], 여기서 a([1 7 2]) = [] 라고 하면 1,7,2번째 원소들 제거됨

   

   

   

***매트랩 함수, function

      

    <기본 모양>

    function [outarg1, outarg2, ... ] = name( inarg1, inarg2, ...)

    %comments to be displayed with help

    ...

    outarg1 = ...;

    outarg2 = ...;

    ...

   

    <예제>

    function d = dice(n)

    d = floor( 6 * rand(1,n) + 1);

   

    <다른 예제, DH 파라미터 구하는 함수>

    function T = makeTransMat(alpha, a, theta, d)

    Rx=[1 0 0 0; ...

        0 cos(alpha) -sin(alpha) 0; ...

        0 sin(alpha) cos(alpha) 0; ...

        0 0 0 1];

    Dx=[1 0 0 a; ...

        0 1 0 0; ...

        0 0 1 0; ...

        0 0 0 1];

    Rz=[cos(theta) -sin(theta) 0 0; ...

        sin(theta) cos(theta) 0 0; ...

        0 0 1 0; ...

        0 0 0 1];

    Dz=[1 0 0 0; ...

        0 1 0 0; ...

        0 0 1 d; ...

        0 0 0 1];

    T=Rx*Dx*Rz*Dz;

   

   

   

*** 박스 그리기

      

    abox = [0 2 2 0 0; 0 0 1 1 0; 1 1 1 1 1]

    plot(abox(1,:),abox(2,:), 'b-');

   

   

   

*** 그리기

   

    plot ( [0 4], [1 3] )  %0,1과 4,3 사이에 선 긋기   help plot으로 많은 정보 볼 수 있음

   

    %예제

    plot([1.068 1.274 1.517 1.748 2.030],[550 450 203 132 75],'b')

    hold on

    plot([1.064 1.272 1.508 1.769 1.950],[3072 2200 1440 1120 900],'g')

    plot([1.080 1.290 1.482 1.736 2.000],[2940 2700 1620 1107 936],'r')

    plot([1.013 1.236 1.516 1.763 2.004],[2442 1400 792 432 320],'c')

    plot([1.022 1.263 1.515 1.771 2.032],[1963 1134 804 616 380],'n')

   

    gtext('X marks the spot')  %그래프에서 마우스 찍는 곳에 텍스트 그리기

    text(x,y, 'test')  %그래프에서 x,y좌표에 문자열 text 쓴다

   

    grid  %현재 그래프에서 격자선을 추가하거나 삭제

      

    title('text')

    xlabel('horizontal')

    ylabel('vertical')

   

    axis([xmin, max, ymin, ymax])  %축의 한계 설정

    axis auto  %축한계 다시 자동으로 바꿀 때

    axis equal  %x,y축 스케일 같게, 원 같은거 그릴때 편함

   

    figure(0)  % 0, 1, 2 등을 사용하여 작업할 그래프 선택

    hold on  %이전것들 덮어서 계속 작업

   

   

   

   

***polar coordinate로 그리기

   

    t = [0:22.5:360-22.5,0]/180*pi;      %radian으로 해야함

    r = [10, 14, 30, 33, 55, 11, 22, 33, 13, 42, 32, 12, 23, 13, 5, 25, 10];

    polar(t,r)

    %polar(t,r,'-r')  %옵션, 점선에 붉은색으로

   

   

   

*** 이미지 관련

      

    im = imread('ZEON.jpg');

    imshow(im)

    im2 = rgb2gray(im);

    im3 = double(im2)/255;

    imagesc(im3)

    max(max(X))  %이미지 내에서 최대 값 찾을 때  ->  max(im(:)) 이러케도 됨

    min(min(X))   %이미지 내에서 최소 값 찾을 때  ->  min(im(:)) 이러케도됨

   

      

   

   

***Matlab 종료시키기

    프롬프트에서 quit 또는 exit

   

   

   

   

***멕시코 모자(Mexican hat) 그리기

    [x y] = meshgrid(-8:0.5:8);  %x,y 평면(z=0인)에 0.5 간격으로 -8~8까지 점들 생성

    r=sqrt(x.^2 + y.^2) + eps;

    z=sin(r)./r;

    mesh(z);  %안쪽이 빈 mesh, 그물형태로 그림

    surf(z);  %격자 안쪽을 색을 칠하여 그림

    meshc(z);  %아래쪽에 등고선처럼 선 그려줌

    surfc(z);  %마찬가지로 아래쪽에 등고선처럼 선 그려줌

    surf(z), shading flat  %칠한 색만 남기고 격자 그물무뉘는 없애줌

   

   

   

***간단한 사운드, 음악, 소리 불러오기

    load handel  %chrip, gong, laughter, splat, train 등 가능.

    sound(y,Fs)

   

   

   

***지수 숫자 표시하기

1.234e9  %1.234 * 10의 9승

2.3e-2  %2.3*10의 -2승

   

   

   

   

***결과, 문자 등 출력하기, printf 처럼

disp (variable)  %출력하고자 하는 변수 넣기

disp ('hello world')  %hello world 출력하기(문자열)

disp (['num of point :', numofpts]  %문자와 변수 이런식으로 같이

   

format short e  %(부동소수점 형태로 출력)

format long e  %(15자리 유효숫자로 출력 (지수))

format long  %(15개의 숫자로 고정 소수점 형태)

format long g  %출력값을 예상 못하겠다면.  g == general

format bank

format compact/loose  %보다 간결한 표시 compact, 해제하려면 loose

format hex  %16진수 표시

format rat  %분수 값 표시용

format +  %양수와 음수, 0에 따라 +,-표시와 빈칸이 표시됨

format  %다시 기본값으로 돌아가고플떄

   

   

   

   

***for문

%제곱근의 연산

a=2;

x=a/2;

for i=1:6

    x=(x+a/x)/2;

    disp(x)

end

   

disp('Matlab' 's value: ')

disp(sqrt(2))

   

***while문

while condition

    statements

end

   

   

   

   

   

   

*** 수행시간 측정

t0 = clock;

%process

etime(clock, t0)

   

tic

%process

toc

   

   

   

   

   

*** if-else

if x<0 disp('neg'), else disp('non-neg'), end

if x<0 disp('neg'), elseif x>0 disp('non-neg'), end

   

   

   

***switch

d=3;

switch d

case 1

    disp('1');

case 2

    disp('2');

otherwise

    disp('other');

   

   

   

*** 복소수 전치

a=[1+i, 2+2i; 3+3i, 4+4i]

   

a` = 1.0000-1.0000i  3.0000-3.0000i

      2.0000-2.0000i  4.0000-4.0000i

   

a.` = 1.0000+1.0000i  3.0000+3.0000i

       2.0000+2.0000i  4.0000+4.0000i

   

   

   

   

***데이터 저장과 불러오기

% %e, %f, %g 있음, 유효소수점 별로 신경쓰기 싫다면 g가

a=1;

b=0.3;

fprintf('print test : %f  %g\n',a,b);

%fprintf('myfile', '%g', x)

   

%fopen, fread, fwrite, fseek 등

A=[1 2 3; 4 5 6];

save myData.txt A -ascii  %-ascii 대신 -tabs 옵션 가능

load myData.txt

A=load('myData.txt')

   

   

   

***변수에 데이터 입력 받기

a = input('enter a value:');

   

   

   

***OS 명령어 실행하기

%명령어 앞에 ! 를 붙여 OS 명령어를 바로 실행시킬 수 있음

!dir

!time

   

   

   

***각종 함수들

%절대값

abs(x)

%올림

ceil(x)

%0을 향하여 가장 가까운 정수로 반올림

fix(x)

%내림

floor(x)

%x에 가장 가까운 정수로 반올림

round(x)

%시간과 날짜

t=clock

fprintf(' %02.0f:%02.0f:%02.0f\n', t(4), t(5), t(6) );

%벡터의 누적합

comsum(1:4)

%dd-mmm-yyyy 형태의 날짜 표시

date

%벡터 x의 원소의 개수

length(x)

%벡터x에서 가장 큰 원소, 작은 원소

max(x)

min(x)

%벡터x 원소들의 평균값

mean(x)

%2^x

pow2(x)

%벡터 x원소들의 곱

prod(x)

%0~1 사이의 랜덤한 난수

rand

%사용자 컴퓨터에서 가장 큰 양의 실수, 가장 작은 양의 실수

realmax

realmin

%x를 y로 나누었을 때의 몫, 나머지값

fix(x/y)

rem(x,y)

%x의 부호, -1,0,1이 나옴

sign(x)

%행렬 a의 행과 열의 수

size(a)

%오름차순으로 벡터x의 원소를 정렬

sort(x)

%n차 파스칼 행렬 생성

pascal(n)

%마정방 사각형 생성

magic(10) 

%행렬 관련

det  %행렬식(determinant)

eig  %고유값

expm  %행렬 지수,  e^A

inv  %역행렬

svd  %특이치 분해

diag  %대각행렬을 생성하거나 추출

fliplr  %왼쪽에서 오른쪽으로 열을 뒤집음

flipup  %위에서 아래로 행을 뒤집음

rot90  %반시계방향으로 회전시킨다

tril  %삼각형 형태의 아래 부분을 뽑아낸다

triup  %삼각형 형태의 윗부분 뽑아낸다

   

   

   

   

*** 0으로 나눠지는 것 피하기, 무한대로 가는 것 피하기

x=x+(x==0)*eps;   %x=x+(~x)*eps;

y=sin(x)./x;  %x가 0일 때 문제 생김

   

y=tan(x);

y=y.*(abs(y) < 1e10);

   

   

   

*** 연산자 우선순위

   

1    ()

2    ^ .^ ' .'(pure transpose

3    +(unary plus) -(unary minus) ~(NOT)

4    * / \ .* ./ .\

5    +(addition) -(subtraction)

6    :

7    > < >= <= == ~=

8    &(AND)

9    |(OR)

   

   

   

***논리 벡터, 함수

%벡터에서 특정 원소 모두 제거하기

a=a(a>0)  %0보다 큰 원소만 남기고 모두 제거한다

%만약 x의 어떤 원소라도 0이 아니면(참이면) 스칼라 값 1(참)을 내보냄

any(x)  

%만약 x의 모든 원소가 0이 아니면 스칼라 값 1(참)을 내보낸다

all(x)  

%a가 작업공간 상의 변수 명이라면 1을 내보냄

exist('a')  

%벡터 x의 0이 아닌 원소의 첨자를 포함하는 벡터로 돌려줌

find(x)  

a=a(find(a))  %a에서 0인 원소를 모두 제거

find(x>=max(x))  %가장 큰 원소가 하나 이상일 때 그 첨자를 찾는다

%x가 빈 배열(0x0 크기)이면 1, 아니면 0

isempty(x)

%x의 원소가 +Inf, -Inf가 있으면 1, 아니면 0

isinf(x)

%x의 원소 중에서 NaN이 있으면 1, 아니면 0

isnan(x)

x(isnan(x))=[]  %x에서 NaN 제거하기

   

   

   

*** menu, GUI

k=0;

   

while k~=3

    k=menu('click on your option', 'do this', 'do that', 'quit');

    if k==1

        disp('do this...press any key')

        pause

    elseif k==2

        disp('do that... press any key')

        pause

    end

end;

   

   

   

*** 보간법 (interpolation)

%interp1은 2차원 데이터의 1차원 보간을, interp2는 3차원 데이터의 2차원 보간을 수행

interp1(x,y,x_new)

interp1(x,y,x_new,'linear')

interp1(x,y,x_new,'spline')

   

polyfit(x,y,n)

   

원본 위치 <http://kimhj8574.egloos.com/4818260>