[MATLAB] 자주쓰는 기능들 -Matlab


많이 쓰지 않아 자꾸 잊어버리는 매트랩

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

    %m 파일 처음에 넣으며깨끗하게 하는
    clear all;  %clear 변수명 하면 그 변수 지워짐
    close all; clc;

    *clear - 선언한 변수들 지우기
    *close - 닫기
    *clc - 명령창 깨끗하게

    whos %지금 있는 변수 들 보기

    pause(3)  %3초동안 딜레이 주기


***행렬(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)  %행과 열로 접근
    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];  %3행은 걍 무시
    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  %이전것들 덮어서 계속 작업

    %그냥 점으로 찍고 싶을 때
    plot(x, '.') 



***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')  %옵션, 점선에 붉은색으로



*** 이미지 관련
    
    %이미지 불러오기
    filename = sprintf('%04d.bmp', cnt);
    im = imread(filename);
    imshow(im)
    im2 = rgb2gray(im);
    im3 = double(im2)/255;
    imagesc(im3)
    max(max(X))  %이미지 내에서 최대 값 찾을 때  ->  max(im(:)) 이러케도 됨
    min(min(X))   %이미지 내에서 최소 값 찾을 때  ->  min(im(:)) 이러케도됨

    %이미지 저장하기
    filename = 'testout';
    for i=1:20
        imwrite(im, [filename, num2str(i), '.jpg']);
    end

    %UI 띄워서 파일 선택하기
    [tmpfName,PathName] = uigetfile('*.jpg','Select an image file');
    %tmpfName에 파일이름 '001.jpg' 처럼, PathName에 경로, 'C:\images\'

    %보통 아래와 같이 쓴다
    [tmpfName,PathName] = uigetfile('*.jpg','Select an image file');
    FileName = [PathName tmpfName];
    input_img = imread(FileName);

    [h w ch] = size(input_img);  %이미지의 높이, 폭, 채널
    
   

***마우스 입력 받기
    f_pts = ginput(4);  %4개의 점을 마우스 클릭으로 입력받는다




***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 처럼
% %e, %f, %g 있음, 유효소수점 별로 신경쓰기 싫다면 g가.  원래 파일입출력용이지만 걍 써도 됨
a=1;
b=0.3;
fprintf('print test : %f  %g\n',a,b);

%좀 다르게
a=1;
str = sprintf('print test : %d\n', a);
disp(str)


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)  %다차원일 경우, 가장 긴 길이를 준다.  max(size(x)) 와 같다.

%벡터x에서 가장 큰 원소, 작은 원소
max(x)
min(x)
%벡터x 원소들의 평균값
mean(x)
mean(x,2)  %이렇게 하면, 행방향에 대해서가 아닌 열방향에 대해서 평균
%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) 
%행렬 관련
A'  %A의 전치행렬(transpose)

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)



*** 파일, txt 텍스트 등에서 문자열 숫자 등 불러오기

%11_00434_1_04_00_00_0_2_000_001.BMP    11_00434_1_04_04_00_0_2_001_001.BMP    22    741
%이런식으로 10줄이 txt 파일에 저장되어 있음, 탭키로 나눠져 있고

clear all; 
close all; clc;

%% read samples
inputfile = fopen('aa.txt','r');
for i=1:10    
    s1{i}= fscanf(inputfile, '%s.bmp\t');  %\t 없어도 되는듯.  매트랩에선 탭 신경안쓰는듯
    s2{i}= fscanf(inputfile, '%s.bmp\t');
    d1(i)= fscanf(inputfile, '%g',1);
    d2(i)= fscanf(inputfile, '%g',1);
end

 

fclose(inputfile)




*** 셀(shell) 쓰기

m{1}  %이런식으로 중괄호로 접근

m{1} = 1;
m{2} = [2 3];  %이런식으로 크기 다른 벡터 넣을 수 있다





*** sprintf

num = 5;
string = sprintf('%s_%04d.jpg', 'img', num)




*** 3차원 그래프 그리기

x = [10 10 10;
    13 9 4;
    15 4 2
    5 2 2];

plot3(x(:,1),x(:,2),x(:,3),'*');

axis square off   %배경, 그리드 등을 다 지움
hidden on  %그리드 형태로 그리는 등의 경우, 가려서 안보이는 곳을 지울지 그릴지


핑백

덧글

댓글 입력 영역