본문으로 바로가기

본 강좌에 사용되는 MATLAB은 버젼7.9.0 (R2009b)을 대상으로 합니다.

mat 화일 읽기 !

MATLAB에서 데이터만 저장하는 화일을 mat화일이라고 합니다. 다루는 데이터의 등치가 큰 경우, 이 mat화일을 잘 활용하면 꽤 유용합니다.

Current Folder에서 운하는 mat화일을 더블클릭하거나

load('경로\화일명.mat')

으로 읽어오면 됩니다. 

이렇게 하면, work space에 

mat화일의 내용이 읽혀있음을 확인할 수 있습니다. 위 mat 화일은

matlab.mat

입니다. 뭐 관심없는 분은 상관없지만, 위 mat화일은 저희가 직접 테스트한 화일로

1열 : 가속도센서에서 추출한 각도

2열 : 자이로센서에서 추출한 각속도

3열 : 엔코더에서 추출한 각도

입니다. 단지 설명을 위한 것이니 실험환경을 설명드릴 필요는 없을 것 같구요.^^. DSP에서 시리얼통신으로 데이터를 가져온 것인데, 샘플링타임은 10ms입니다.

행렬에서 콜론( : ) 연산자 !

이전 강의때 콜론연산자에 대해 이야기 했는데요. 벡터나 행렬에서는 이 콜론 연산자가 재미있는 역활을 합니다. 

위를 보시면, AccAng라는 변수에 아까 읽은 mat화일의 1열을 선택한 것입니다. 물론 mat화일을 저장할때, 저렇게 변수명을 각각 적어줄 수 있지만, 콜론연산자에 대해 이야기도할 겸해서요^^. 

이렇게 data(1:5,1)이라고 명령을 주면 1열의 1행부터 5행까지를 의미합니다. 

위 코드를 한번 보죠. 5행까지는 방금설명을 했구요. 7행은 변수로 샘플링타임(ts)을 10ms로 저장하고, 이제 시간축을 만들어내는 것이 9행입니다. 9행의 의미는 0초부터 0.01초의 간격으로 실험이 끝난 시각까지 시간을 만들어 내는 것입니다. length라는 명령어는 해당 벡터의 크기를 잡아줍니다. 그리고, -1 을 한 것은 0부터 시작해서 그렇구요. /100이야 당연히 ms단위로 만들어 주기 위해서지요^^. 위 코드를 다 실행하면

work space에 위와 같이 나타나야 합니다.

다중 그래프 표현 !

저렇게만 입력하면

위와 같은 그래프나 나타나는데요. (물론 빨간색 글씨는 없어요). subplot이라는 명령어로 한 figure에서 다중 그래프를 표현할 수 있습니다.

subplot(X, Y, N)

의 문법을 가지는데요. X는 위 그림에서 보면 행의 수 즉, 3이 되구요. Y는 열의 수로 2가니다. N은 순번이에요. 코드상에 빨간박스가 쳐져있는 번호가 위 그림의 번호를 의미합니다. 그러면 아까 읽었던 matlab.mat 화일을 가지고 다중 그래프를 한번 그려보죠.

load('matlab.mat')

AccAng = data(:,1)*180/pi;
GyroVel = data(:,2)*0.007*180/pi;
EncAng = data(:,3);

ts = 0.01;

t = 0:ts:(length(EncAng)-1)/100;

DiffEnc = [0; diff(EncAng)/ts];

figure
subplot(4,1,1);
    plot(t, AccAng)
    title('Angle using Accelerometer');
    ylabel('degree')
subplot(4,1,2);
    plot(t, GyroVel)
    title('Angular velocity using Gyro');
    ylabel('degree/sec')
subplot(4,1,3);
    plot(t, EncAng)
    title('Angle using Encoder');
    ylabel('degree')
subplot(4,1,4);
    plot(t, DiffEnc)
    title('Angle using Encoder');
    ylabel('degree/sec')
    xlabel('sec')

위 코드의 실행결과를 보기전에 11번행은 코드내의 변수 EncAng의 차분을 계산하는 루틴입니다. 

위 그림이 실행된 결과입니다. 

3차원 그래프 !

MATLAB의 다양한 그래프 출력 기능들 중 특별한 것들을 그저 간단히 한번 보겠습니다. 그 전에 테스트를 위해 데이터를 임의로 만들 필요가 있겠네요.

위 코드에 meshgrid라는 명령어는 일정간격을 가지는 격자형태의 좌표를 생성해 줍니다. 위 실행결과는 (-1, -1), (-0.5, -1), (0, -1) ... 이렇게 좌표를 생성한 것입니다.

위 형태처럼 Z축상의 데이터를 임의로 생성했습니다. 뭐 일종의 반구형태라고 해두죠^^. 그리고 mesh 명령어로 X,Y,Z 좌표를 다 주면

위 그림을 얻을 수 있습니다.

위에 보이듯이, surf 명령을 사용하면

이런 그림을 얻을 수 있구요.

보통 출력물을 종이로 인쇄하는 경우는 3D가 사실 좀 불편할 때도 있지요. 흔히 등위선이라고 부르는 contour가 이때는 적합합니다.

위 그림처럼 말이죠. contour는 등위선에 대한 주석이 필수 인데요. 그 명령이 clabel입니다.

위와 같이 잡아주는 거죠. 그러면,

 

이렇게 만들어 줍니다. 마지막으로

위와 같이 surfc라는 명령어는

 

저렇게 surf명령어와 같은 결과를 가지면서 X-Y 평면상에 등위선을 같이 그려줍니다.

MATLAB 02. 기초 연산 법 및 그래픽 출력 02.pdf


댓글을 달아 주세요

  1. 박춘성 2010.03.09 11:01 신고

    잘 읽고 있습니다. 많은 도움된것에 대해 감사드립니다. ^_^*

  2. 3학년 2010.03.13 21:42 신고

    질문!

    제가 평면방정식을 meshgrid로 표현을 해봤는데요
    해결은했는데 궁금한것이 있어요

    Z = X*3-Y*5+1; 은 되는데
    계수를 변수앞에서 곱해주면 에러가 뜨네요
    왜 그런거지요?

    • BlogIcon PinkWink 2010.03.14 16:10 신고

      음 저는 테스트를 해보니

      Z = 3*X-5*Y+1;

      를 해도 잘 나오는데요...ㅜ.ㅜ

      혹시 테스트하신 전체코드를 복사(타이핑말고)해서 올려주시면 다시 확인해보겠습니다^^

  3. 3학년 2010.03.14 21:41 신고

    아 죄송합니다
    제가 질문을 잘못했네요
    Z = 3X -5Y + 1; 이게 안된다는 말인데 생각해보니깐 초등학생 질문이였네요-0-;;;ㅋㅋ

    죄송한데 하나더!!
    x(t) = (e^(0.1t))*sin(2t/3)을 그래프로 표현할때
    책에는 x = exp(-.1*t).*sin(2/3*t);라고 되어있네요
    (-.1*t)에서 0이 생략된 이유와 (2/3*t)에서 상수부분이 이해가 되지않네요

    너무 죄송한데 하나만 더 여쬐뵈도 될까요?
    책이 영어라서 이해가 잘안되는데 QQQQdata1.svc 라는거 아시는지요?

    너무 감사합니다 이렇게 질문드릴 분이 생겨서^^

    • BlogIcon PinkWink 2010.03.15 04:53 신고

      "0.1"을 표현할때 그냥 "0.1"이라고 해도 되고, ".1"로 표현해도 됩니다. 계산기들이 일반적으로 사용하는 입력의 표현입니다.
      (e^(0.1t))*sin(2t/3)

      (e^(0.1*t))*sin(2*t/3) 이나
      (e^(0.1*t))*sin(2/3*t) 나 역시 같은 표현입니다.

      아 그리고, QQQQdata1.svc는 잘 모르겠는데요^^

  4. SG 2010.05.21 10:58 신고

    안녕하세요!ㅎ 감사한 글로 잘 공부하고 있습니다 ㅎ
    몇가지 궁금한게 좀있는데요!ㅎ
    t=0:ts:(length(EncAng)-1)/100
    에서 length의 역할을 잘모르겠습니다.
    해당벡터의 크기를 잡아준다고 하셨는데 EncAng는 위에서 정의하길 mat파일의 3열을 선택한 것인데요
    그 3열을 벡터로 표현한다는게 잘 이해가 안됩니다.ㅎ;;
    그리고 0부터 시작하려고 -1을 하셨다고 하셨는데 그건또 무슨 의미인지 잘 모르겠어요;;
    그럼 원래 data의 내용은 처음시작이 1인 것인지요..?

    허접한 질문 죄송합니다.ㅠ

    • BlogIcon PinkWink 2010.05.21 11:15 신고

      t 는 시간축을 잡아 주는데요. 당연히 원 데이터와 같은 크기를 가져야합니다. EncAng가 만약 1000개의 데이터를 가지고 있다면, t는 ts(10ms)의 간격이니까. 10초까지가 아니라, 9.99초까지입니다. 왜냐면, 크기는 1부터 세는거고. 시간은 0초부터니까요. 그래서 EncAng의 크기를 length로 받아서, 시간 t는 0부터 ts의 간격으로 가는데 어디까지냐면, (length(EncAng)-1)/100까지하라고 한 것입니다. 아니면, t=(0: (length(EncAng)-1))/100을 하셔도 됩니다.

  5. 정인 2011.02.08 08:16 신고

    안녕하세요. 저 혹시 타원체를 원점 이동시키는 방법좀 가르쳐 주실수 있나요? 단순하게,
    cx=50;cy=60;cz=30;
    a=10;b=10=c=15;
    [x,y] = meshgrid(linspace(-100,100,100));
    z = sqrt ( c.^2.*(1-((x-cx)./a).^2-((y-cy)./b).^2) ) + cz
    contour3(x,y,z,30);를 사용했더니, 위아래 z축방향으로는 전혀 움직이지 않고, 오히려 xy평면으로 움직여서요. 혹시 제 방법에 뭐가 문제가 있는지 봐주실 수 있으세요?

  6. 정인 2011.02.15 01:11 신고

    수학적으로 그렇게해야 맞는데요. 매트랩코드에서는 z=~~~~+a해서는 z축방향으로 이동이 되는 것이 아니라 x축 y축에대해서 대각선 방향으로 움직여서 여쭤봤어요. 저만 그러는가? 이상한데...

    • BlogIcon PinkWink 2011.02.15 14:06 신고

      [x, y] = meshgrid(-1:0.01:1);
      z = (1-x.^2-y.^2).^0.5;

      plot3(x,y,z);grid on;hold on

      z = (1-(x-1).^2-(y-1).^2).^0.5+1;
      plot3(x,y,z)

      x,y,z 축으로 모두 1씩 움직이라고 했는데 잘 되는군요.

  7. 정인 2011.02.16 00:35 신고

    할말이 없네요. 핑크윙크님코드는 잘 되는데, 왜 제건 이상한 뻘짓을 하는지... 다시보죠. ^^ 고맙습니다.

  8. 공대생 2011.05.10 16:30 신고

    정말 잘 보구 갑니다 ㅋㅋ 이렇게 좋은 자료를
    공유한다는게 정말 쉬운게 아닌데 감사합니다!

    • BlogIcon PinkWink 2011.05.11 07:54 신고

      MATLAB에 대해 조금 더 공부하시면, 이 자료 정도는 아무것도 아니라는 것을 알 수 있습니다.^^.. 그래도 도움이 되었다니 다행입니다.^^

  9. BlogIcon 공대생 2011.07.11 15:56 신고

    안녕하세요 핑크윙크님 공대생으로 매틀랩을 해야되는데 잘 몰라서 이렇게 글을 남기게 되었습니다.
    질문이 좀 길어질거 같아서 http://blog.naver.com/taz86 에 질문을 남겨 놨습니다. 조금의 힌트나 조언좀 부탁드리겠습니다.

  10. 김성현 2011.10.30 22:28 신고

    정말 좋은 자료 잘보고 갑니다. 매틀랩 잘 몰라서 써야할때 문제였는데 큰 도움이 되겠네요 고맙습니다.

  11. 박성진이라고해요 2011.11.05 01:49 신고

    오옷 .. 그냥 지나칠수가 없군요!!!!!!!!! 너무 너무 감사합니다. 잘 배울게요.

  12. 조민철 2012.02.27 23:44 신고

    mat화일은 어떻게 만드는 것이죠? *.txt 피일을 mat파일로 만들어야 하는데 말이죠..ㅠ

    • BlogIcon PinkWink 2012.02.28 08:21 신고

      txt를 읽어서 mat화일로 저장을 하셔야합니다.
      save 명령을 사용하셔도 되고,
      메뉴에서 선택하셔도 됩니다.

  13. Matlab user 2013.09.03 12:10 신고

    안녕하세요. 예전부터 matlab에 대한 참고를 할 때부터 많이 들락날락 했습니다. 제 질문에 답해 주신 적도 있으시구요. 좀 간단한데 이상하게 해결이 안되는 부분이 있어서 이렇게 올립니다.
    어떤 행렬에서 max 값을 찾는 것을 하고 있습니다. 당연히 max를 써서 하면 되는데요.
    이 행렬은 16*15 크기이고 양의 실수로 이루어져 있고 0보다 다 큽니다. (최소 0.0027 이는 workspace에서 확인한 것입니다.)
    그런데 max값이 안구해지고 계속 ??? Subscript indices must either be real positive integers or logicals.
    라는 메세지만 뜨네요. 다른 16*16 행렬은 잘 구해지는데 말입니다.
    max값을 다른 곳에 써야하기 때문에 그 값을 받아오려고 하는데 좀처럼 해결이 되질 않네요.
    다른 방법들을 많이 사용해 보았지만 계속 저 메세지만 뜨고 되질 않네요.
    또 제가 혹시 몰라서 다 양의 정수로 만들어 보니 ??? Index exceeds matrix dimensions. 이 메세지가 뜹니다.
    어떤 점이 문제인지 혹시 알 수 있으신가 하여 이렇게 질문을 남깁니다.
    문제가 될 수 있는 가능성이 있는 부분이라도 말씀하여 주신다면 감사하겠습니다.

    • BlogIcon PinkWink 2013.09.05 20:13 신고

      현재 티스토리의 댓글 시스템이 이상한듯합니다.
      아무리 제가 답글을 달아도 지워지네요..ㅠㅠ. 제가 이 블로그의 주인인데도 말이죠^^
      아무튼
      http://pinkwink.kr/369
      를 보시면 아시겠지만, max 함수는 행렬에 적용하는 경우 무조건 제일 큰 값을 알려주는 것이 아니라, 각 열별로 큰 값을 알려줍니다.
      혹시 그 부분에서 오류가 있는 것은 아닐까요?^^

  14. 이지형 2015.02.17 18:19 신고

    정말 감사합니다....

    정말 좋은 자룡입니다..

    정말 이제야 제대로 찾은 듯합니다 ㅡㅡ

  15. 2015.11.22 20:29

    비밀댓글입니다