[MATLAB] 자주쓰는 기능들
오랜만에 친구부탁으로 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)