MATLAB 을 사용하여 그래프를 그리는 경우 축을 반전해서 보는게 편한 경우가 종종 있습니다.

이런 경우에는 두가지 방법을 사용할 수 있습니다. 



아래 예에 대해 축을 반전하고 싶은 경우


x=1:0.1:10;
y=sin(x);

plot(x,y)
grid on


  • 플롯 툴을 사용하여 변경하는 방법

플롯 툴 아이콘을 클릭하여  플롯 툴을 실행 합니다. 



다음으로 그래프의 Axis 선택한 이후에 반전하고 싶은 축을 선택하고 반전에 체크를 하고 마지막으로 플롯 툴 숨기기를 클릭 합니다.
위 그림과 비교해보면 X 축의 값이 좌우가 바뀐것을 확인 할 수 있습니다.
Y 축 또는 Z 축 값을 반전하고 싶은 경우라면 아래 그림에서 X축 Y축  탭을 선택한 이후에 반전을 체크해 주면 되겠죠~ 

  • 코드 상에서 변경하는 방법

코드에서 반전 설정하는 방법은 아래와 같습니다.

x=1:0.1:10;
y=sin(x);

figure1 = figure; % 그래프 핸들 설정
axes1 = axes('Parent',figure1); % 축 설정
plot(x,y)
grid on
set(axes1,'XDir','reverse'); % axes1 축 반전, 그래프 그리는 코드 뒤에 있어야 함


위 코드에서 주석으로 밝힌 바와 같이 축을 반전 시키는 코드는 그래프 그리는 코드 뒤에 있어야 합니다. Y 축을 반전하고 싶으면 XDir 이라고 된 속성을  YDir 로 변경해 주면 되겠고 Z 축을 반전하고 싶다면 당연히  ZDir 이라고 설정해 주면 됩니다.

X, Y 축을 둘다 반전하고 싶다면 다음과 같이 설정하면 되겠고~ 

set(axes1,'XDir','reverse','YDir','reverse');


다음과 같은 그래프가 나오는 것을 확인 할 수 있습니다.

축 반전은 값이 변하는게 아니라 그래프의 축만 변화 시키는 것이므로 헷갈려서는 안 됩니다.



신호 처리에서 convolution은 필터링의 기본이 되는 만큼 매우 자주 사용하게 되는데요~

 

아래 글에서는 MATLAB conv() 함수를 사용하는 게 아닌 for 문을 사용해서 Convolution 을 수행하는 방법에 대해 소개한 적이 있고~

 

http://iamaman.tistory.com/317

 

아래 글에서는 FFT 를 활용하여 convolution 을 하는 방법에 대해 소개한 적이 있습니다.

 

http://iamaman.tistory.com/131

 

오늘은 convolution 수행 시 인덱스를 계산하는 방법에 대해 소개하려 합니다.

 

보통 conv() 함수는 convolution을 수행한 결과만 나오게 됩니다.

 

그런데 신호 및 시스템이나 DSP 등의 과목에서 convolution을 배울 때는 인덱스도 나오게 되죠~

 

다음과 같은 신호 x(n), h(n) 에 대해 convolution 을 수행해 보면~

 

x=ones(1,11);

nx = -5:5;

 

h=linspace(0,5,10);

nh = 0:9;

 

plot(nx,x,nh,h),grid on

legend('x','h','Location','northwest')

axis([-10 10 0 10])

 

 

다음과 같이 인덱스를 포함한 convolution 수행 코드를 작성 할 수 있습니다.

 

function [y, ny] = conv_m(x,nx,h,nh) 

diff1 = (nx(2)-nx(1));

diff2 = (nh(2)-nh(1));


assert(abs(diff1 - diff2) <= eps,'Time difference is not equal!!')

   

ny= linspace((nh(1)+nx(1)),(nh(end)+nx(end)),length(x)+length(h)-1);


y = conv(x,h);

 

위 conv_m() 함수를 사용하여 위에서 소개한 x(n), h(n) 에 대한 convolution 을 수행하면

 

[y, ny] = conv_m(x,nx,h,nh);

plot(ny,y),grid on

legend('Convolution Result','Location','northwest')

 

인덱스가 -5~14까지 인 다음과 같은 결과나 나오는 것을 확인 할 수 있습니다.

 

인덱스를 포함한 Convolution~ 참 쉽죠~



움직이는 그래프를 만들어 보자

매트랩에서 그래프를 동영상으로 만드는 방법은 매우 간단하다.

변수에 따라 for 문을 이용하여 그래프를 그리고 각 프레임을 저장을 한다. 그리고 movie() 함수를 이용하여 실행한다.

아래 코드는 사인 함수의 계수값을 증가시키면 어떻게 되는지를 보여주는 코드이다.  


axx = 0:0.01:2*pi;  

for k=1:16
plot(axx, k*sin(axx));

grid on

axis([0 2*pi -16 16])

M(k)=getframe;

end

movie(M,1)  


avifile() 함수를 이용하여 avi object 를 만들어서 avi 파일로 저장도 가능하다.

아래 결과는 좀더 좁은 간격의 k 값에 대하여 실행한 결과이다. 
 



  1. ㅠㅠ 2012.03.20 01:32

    동영상처럼 나오게 하려고 했는데
    for k=0.1:0.1:16으로 하니 Subscript indices must either be real positive integers or logicals. 에러뜨네요 ㅠㅠ 방법좀 알려주시면 감사하겠습니다!

    • 남성 2012.03.20 02:26 신고

      for k=0.1:0.1:16 로 하면 k 값은 0.1, 0.2, 0.3 ... 16 까지 가는거죠.

      그렇다면 아래 부분의 코드를 보면 M(k)=getframe; 부분에서

      M(0.1), M(0.2), .... M(16) 이렇게 들어가게 되겠죠. 벡터 또는 매트릭스의 인덱스는 양의 정수나 logical 값만 들어가야되니깐 에러가 나게 되는거죠.

      좋은 방법은 아니지만 아래와 같이 코딩할 수도 있습니다.


      axx = 0:0.01:2*pi;

      for k=0.1:0.1:16
      plot(axx, k*sin(axx));

      grid on

      axis([0 2*pi -16 16])

      M(round(k*10))=getframe;

      end

      movie(M,1)


      더 좋은 방법은 k를 1:160 으로 하고

      plot(axx, k./10 .*sin(axx)); 이렇게 바꿔주는게 개인적으로는 더 추천 하는 방식입니다.

  2. 2012.03.20 22:24

    비밀댓글입니다

    • 남성 2012.03.20 22:54 신고

      죄송하지만, k가 커졌다 작아졌다 한다는게 정확히 무슨 말씀인지 모르겠네요. 좀더 구체적으로 말씀해 주시는게 좋을듯 합니다.

      k 값이 1에서 부터 16 까지 갔다가 다시 1로 줄어들게 되는걸 말슴하시는건가요? 아님 계속 k 값이 랜덤 하게 들쭉 날쭉 하게 되게 한다는건가요?

    • 2012.03.21 00:52

      비밀댓글입니다

    • 남성 2012.03.21 01:01 신고

      이렇게 하면 됩니다.


      axx = 0:0.01:2*pi;

      temp_k=[1:16 15:-1:1];

      for k=1:length(temp_k)
      plot(axx, temp_k(k)*sin(axx));

      grid on

      axis([0 2*pi -16 16])

      M(k)=getframe;

      end

      movie(M,1)

  3. 2015.07.30 14:52

    비밀댓글입니다

    • 남성 2015.07.30 23:52 신고

      위 코드에서는 M 의 인덱스가 잘못된것 같네요.

      다음과 같이 해 보세요.

      아래 코드가 방문자님이 의도한게 맞나 모르겟네요.

      wt = 0:pi/50:10*pi;

      x = cos(wt + (pi/180));
      y = wt-wt;
      x1 = wt-wt;
      y1 = cos(wt);

      for c = 0:1:10
      figure
      plot3(x-c, y, wt, x1, y1-c, wt)

      axis tight
      grid on
      M(c+1)=getframe;
      end

      movie(M,1)

    • 2015.07.31 11:08

      비밀댓글입니다

    • 남성 2015.07.31 12:15 신고

      다음과 같이 해보세요.

      wt = 0:pi/50:10*pi;

      x = cos(wt + (pi/180));
      y = wt-wt;
      x1 = wt-wt;
      y1 = cos(wt);

      h=figure(1);
      set(h,'visible','off')

      for c = 0:1:10
      plot3(gca, x-c, y, wt)
      axis([-10 10 -10 10 0 32])
      grid on
      M(c+1)=getframe;
      end

      set(h,'visible','on')
      movie(M,1)

    • 2015.08.01 12:45

      비밀댓글입니다

    • 남성 2015.08.01 13:41 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

+ Recent posts