2014년 11월 29일 토요일

매트랩으로 배우는 행렬

매트랩을 이용하여 행렬을 나름대로 정리해보려고 한다!


1. 행렬식

임의의 행렬 A에 대해 A의 행렬식(determinant)이라 불리는 수가 대응된다.


 
A=[1 2 -3; -4 0 3; 5 -2 4];

U=det(A)


결과) U=44
 


이 행렬식은 나중에 다룰 역행렬을 구할때, 연립방정식의 해를 구할 때 중요하게 사용된다.

어떤 행렬 A의 행렬식 값 det(A) = 0 이면 행렬 A는 역행렬을 갖지 않고 det(A)≠0이면 A의 역행렬이 존재한다. 즉, 행렬식(determinant)은 어떤 행렬의 역행렬 존재여부에 대한 판별값 역할을 한다.

도형 P가 선형변환 A에 의해 P'으로 변환되었을 경우, det(A)는 선형변환의 스케일(scale) 성분을 나타내는 값이다. 또한 determinant의 부호가 det(A)>0이면 도형의 방향(orientation)이 보존되고 det(A)<0이면 도형의 방향이 보존되지 않는 기하학적인 의미가 있다.



2. 역행렬



syms a b c d;

A=sym([a b; c d]);

inv(A)

결과) inv(A)=               [ d, -b]
                      1/(ad - bc)[ -c, a]
 
pretty(inv(A)*A)

pretty(A*inv(A))
결과) [1 0]
          [0 1]

 


행렬 A의 원소들에 대한 여인수들로 구성된 행렬의 전치행렬을 수반행렬(adjoint)이라 하고,

A의 역행렬을 구하는 공식은 다음과 같다.

inv(A) = 1/det(A)*adj(A)





3. 고유값(eigenvalue)과 고유벡터(eigenvector)

고유값은 특성값(characteristic value)라고도 한다.

고유값, 고유벡터는 기하학적으로 AV=λV 이므로 벡터 AV 와 벡터 V=[v1; v2]의 방향이 같다.

다만 벡터의 크기는 고유값 λ에 의해 좌우된다.

다음은 고유값 응용의 예(질량-스프링 시스템)이다.


이것이 질량-스프링 시스템의 진동하는 애니메이션이다.




% 질량-스프링 시스템
p1=[-3 1 2 2];
p2=[1 1 2 2];
p3=[-3 -3 2 2];
p4=[1 -3 2 2];


r1=rectangle('Position',p1,'facecolor','r');
r2=rectangle('Position',p2,'facecolor','g');
r3=rectangle('Position',p3,'facecolor','r');
r4=rectangle('Position',p4,'facecolor','g');

l1=line([-5 p1(1)],[2 2]);
l2=line([p1(1)+2 p2(1)],[2 2]);
l3=line([-5 p3(1)],[-2 -2]);
l4=line([p3(1)+2 p4(1)],[-2 -2]);


axis([-5 5 -5 5]);
txt=text(-1, 4, ['시간 :  초'],'EraseMode','normal');
nFrames = 0;

for t=0:.1:10
nFrames = nFrames +1;
up1=p1+[0.8507*cos(1.6180*t) 0 0 0];
set(r1,'Position',up1);
set(l1,'XData',[-5 up1(1)]);

up2=p2+[0.5257*cos(1.6180*t) 0 0 0];
set(r2,'Position',up2);
set(l2,'XData',[up1(1)+2 up2(1)]);

up3=p3+[0.5257*cos(0.6180*t) 0 0 0];
set(r3,'Position',up3);
set(l3,'XData',[-5 up3(1)]);

up4=p4+[0.8507*cos(0.6180*t) 0 0 0];
set(r4,'Position',up4);
set(l4,'XData',[up3(1)+2 up4(1)]);

pause(.01)
set(txt,'Position',[-1 4],'String',['시간 : ', num2str(t), ' 초']) % (x,y) 위치에 문자열 갱신
drawnow
mov(nFrames) = getframe(gcf);
end
movie2avi(mov,'eigen','compression','None');
 



4. 분산(variance), 공분산(covariance), 상관계수(correlation coefficient)





Fs=8000;
n=Fs;
beep
x=wavrecord(Fs,Fs); % 비프음후 1초간 Fs로 샘플녹음
 
beep
y=wavrecord(Fs,Fs); % 비프음후 1초간 Fs로 샘플녹음
plot(1:n,x, 1:n, y)


variance=var(x)                               % 분산

sum((x-mean(x)).^2)/n

sum(x.^2)/n-mean(x)^2


covariance=cov(x,y)                             % 공분산

sum((x-mean(x)).*(y-mean(y)))/n

sum(x.*y)/n-mean(x)*mean(y)


correlation_coefficient=corrcoef(x,y)                    % 상관계수

o=[1/std(x)/std(x) 1/std(x)/std(y); 1/std(y)/std(x) 1/std(y)/std(y)];

cov(x,y).*o
 


평균(m=[3 5])과 공분산(s=[1 1; 1 2])를 따르는 가우시안 분포를 플롯하기

  
N=2^10;

m=repmat([3, 5], N,1);

s=[1 1; 1 4];

x=randn(N,2)*sqrtm(s)+m;    % sqrtm(s)*sqrtm(s)=s

plot(x(:,1),x(:,2),'d');
 

검증)  ss=cov(x)
 


댓글 없음:

댓글 쓰기