*** 직접연산 아닌 여러가지 기능들
%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') %옵션, 점선에 붉은색으로
*** <font-size id="altools-findtxt" bold="bold">이미지 관련</font-size> %이미지 불러오기 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 %그리드 형태로 그리는 등의 경우, 가려서 안보이는 곳을 지울지 그릴지
출처: http://kimhj8574.egloos.com/4818260
[출처] 매트랩 명령어들|작성자 ninestar
|