강좌 순서

1. MATLAB 각 Window 사용법 [바로가기]
2. M-File을 사용한 기초연산법 및 데이터의 그래픽 출력 [바로가기]
3. 데이터의 3D 출력 [바로가기]
4. 조건문 및 반복문의 사용. 에러대비 [바로가기]
5. Simulink의 기초 [바로가기]
6. Simulink의 기초 2 [바로가기]
7.  Function 문의 사용 [바로가기]
8. 동역학 시뮬레이션하기 [바로가기]
9. 애니메이션 구현하기 [바로가기]
10. 애니메이션을 이용한 동역학 시뮬레이션하기 [바로가기]
11. LQR 툴박스를 사용하여 제어기 구현하기 [바로가기]
12. GUI 시작하기 - Static, Edit Text 및 Push Button [바로가기]
13. GUI - Slider 사용하기 [바로가기]
14. GUI - List Box와 Pop-up Menu [바로가기]
15. GUI - Check Box와 Radio Button [바로가기]
16. GUI - 종합 예제 [바로가기]

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




   if 문을 이용한 조건문의 구현 !  
 


MATLAB에서 if문은 위의 문법을 따릅니다. expression자리에 조건이 들어가서 참이면 해당 statements를 실행하게 됩니다. 첫 if 문의 조건이 맞으면 해당구문을 실행하고 end하는 거죠. 아니면 elseif가 있다면 그 조건을 다시 검색하고, 아니면 else라도 실행을 합니다. elseif와 else는 사용자의 선택에 따라 있을 수도 있고 없을 수도 있습니다.


위 예제코드를 보면, I가J와 같다면, 행렬A의 (I, J)위치에 2를 저장하고, 아닐때는 I와 J의 차이가 1이면 (I, J)위치에 -1일 저장하고, 그것도 아니면 0을 저장하도록하는 예제입니다.

 
같다를 의미하는 '='기호는 프로그램에서는 변수의 저장을 의미하는 것이기 때문에 조건문에서는 특별히 '=='를 사용합니다. 그리고, 다르다(not equal)은 '~='을 사용합니다. 




   for 문을 이용한 반복문의 구현 !  
 

for 문의 문법은


입니다. init은 초기값이고, final은 끝값입니다. 1:10이라고 하면 1부터 1씩  증가하면서 10까지를 의미합니다. 여기서 증가간격을 조절하고 싶다면 n을 넣어주면 됩니다. 1:2:10이라고 하면 1부터 2간격으로 10까지가 됩니다.


위 예제를 보시면, 음... k가 정의되지 않앗네요. k=3정도로 두어도 되겠습니다. for문에서 m이 1부터 3까지 증가하도록 하고, 다시 그 안에 for문이 n이 1부터 3까지 증가하도록됩니다. 그리고 행렬 a에는 소정의 계산결과를 각 위치에 저장하도록 되어있네요.

그런데 for문을 사용할 때는 한가지 조심해야할 것이 있습니다.

 
위 코드와 실행결과를 보시면, for문의 변수가 k이고 1부터 2까지 증가하도록 되어있는게 보이실겁니다. 그리고, for문 안에 k=10이라고 갑자기 변경하고 있는 것이 보이실겁니다. for문의 반복조건이 k=2일때까지니까 한번만 실행되고 멈출것같지만, 그렇지 않습니다. 그렇지 않다는 것을 실행결과에서 보여주고 있습니다. 




   try - catch 를 이용한 에러대비 !  
 

MATLAB이든 어떤 언어든 에러를 만들지 않아야하는 것은 당연합니다. 그러나 어떤 경우는 해당에러를 코드내에서 모두 막을 수가 없는 경우가 있습니다. 사용자의 오판이나 일일이 예측할 수 없는 경우들인데요. 이럴때 에러코드자체를 피드백받아서 다시 수정된 코드를 실행할 수 있다면 꽤 괜찮을 것입니다. 이 때 사용하는 것이 try - catch 구문입니다. 


위 코드는 try- catch 구문의 사용 예입니다. (출처는 도서출판 아진의 임종수 님의 책을 참조했습니다.) 1행의 clear all은 work space의 모든 변수를 삭제합니다. 그리고 try구문안에 에러가 있을지 모르는 구문을 넣어 둡니다. 4행은 문제 없지만, 5행에서는 에러가 나타납니다. z라는 변수가 갑자기 나타났기 때문인데요. 어떤 값을 저장하고 있는지 선언되지 않았기 때문입니다. 이때 에러메세지를 내고 실행을 중단하는 일반적인 형태를 벗어나서 catch구문의 내용을 실행하게 됩니다.


실행한 결과입니다. catch구문의 7행이 실행되었음을 알 수 있습니다. 그리고 exception이라는 변수가 하나 더 생겼는데요. 이것을 열어보면

 
에러 코드가 UndefinedFuntion이라는 것을 알 수 있습니다. 이를 이용해서 if문을 적절이 사용하면 원하는 에러에 대해 각기 다른 행동을 하도록 catch안에 작성할 수 있습니다.


위와 같이 실행하면, A와 B는 열의 숫자가 맞지 않아서 C로 통합될 수 없다는 에러가 나타납니다.

 
위와 같이 작성할 수 있습니다. 위 예제는 matlab help에 있는 예제로 catch안에서 if문으로 어떻게 에러코드를 검색하는 지 보여줍니다.

 
identifier항목을 확인하도록 if문이 꾸며져 있다는 것을 확인하실 수 있습니다.

 
실행결과입니다. 아.. if안에 있는 strcmp명령은 문자열을 비교하는 것입니다. 일치하면 참을 피드백합니다.




   tic - toc 을 이용하여 코드의 실행시간 측정하기 !  
 

MATLAB에서는 특정코드의 실제 실행시간을 측정해서 그 결과를 알려주는 기능이 있습니다. tic - toc이라는 구문인데요.

 
위의 코드를 보면, 1/n^2을 n을 1에서 100000까지 변화시켜가며 더해주는 루틴입니다. 하나는 for구문으로 짜여져 있고, 또 하나는 Dot(.)연산자를 사용해서 for없이 구현하고 있습니다. 측정하고자하는 루틴을 tic-toc으로 둘러싸면 됩니다.

 
그러면, 위와 같은 형태의 결과를 얻을 수 있습니다. 넷북이라 그런지 꽤 실행속도가 느리다는 것을 알 수 있습니다..ㅜ.ㅜ 그래도 같은 기능이라면 for문으로 구현한 것이 아주 느리다는 것을 알 수 있습니다. 그래서 간혹 MATLAB의 고수를 만나면 for를 사용했는지 아닌지를 가지고, 실력의 우위를 판단하려는 경향을 볼 수 있습니다.(^^)

http://pinkwink.kr/trackback/268 관련글 쓰기
  • 초보 2010/03/14 15:32

    감사합니다^^ 연재 잘보고 있어요 ㅎ

    • PinkWink 2010/03/14 16:14

      ㅎㅎ 네... 흔적을 남겨주셔서 저 역시 감사합니다.^^

  • 초보초보 2010/03/31 13:15

    저 역시 감사합니다.. 아직 많이 어렵니만.. 많이 도움됩니다^^

    • PinkWink 2010/03/31 14:16

      ^^ 감사합니다... 많은 도움이 되었다니...^^

  • 사랑합니다 2010/04/04 14:11

    어제처음 깔고 시작했는데 완전 도움 많이 되네요. 수치해석 과제하느라..ㅋㅋ;;
    님의 블로그만 보고도 matlab을 이용해서 간단한건 다 만들수가 있을거 같아요!!
    아직 과제하는중 ㅠ

    • PinkWink 2010/04/04 17:12

      아닙니다..
      제 블로그의 글만보시면.. 그냥 기초만 되지요^^
      좀더 많은 자료를 찾아보세요^^
      좋은 분들의 좋은 글이 인터넷에 많더군요^^

  • 매트랩초 2010/04/13 23:11

    좋은 자료 감사합니다
    질문 하나만 드릴게요

    1과 2를 비교해서
    if 1 > 2 일때
    출력을 1 > 2 이렇게 하고싶을땐 어떻게 되나요?

    • PinkWink 2010/04/14 01:33

      질문을 제가 이해했는진 잘몰라도

      a = 1;
      b = 2;

      if b>a
      sprintf('%d > %d', b, a);
      end

      라고 하면 될것같은데 말이죠^^

  • 하늘사랑 2010/08/20 17:48

    좋은 자료 감사합니다. 유용하게 잘 쓰겠습니다.

  • 하늘다람쥐 2010/09/06 19:40

    감사합니다. 정말 이말 밖에 안나오네요. ^^ 그냥 보고 따라하고 가려고 했는데.. 코멘트를 안할수가 없네요.. 정말 감사합니다.

    • PinkWink 2010/09/07 03:44

      고맙습니다.. 저도 이렇게 감사를 올립니다...^^

  • matlabchobo 2010/11/23 12:17

    저희가 학교에서 섯다를 만들어서 그거때문에 if문을 쓸려고 하는데요
    if를 쓰고 난 뒤에 elseif를 쓰고 else를 쓰시던데 만약에 조건이 3개 이상이면 어떡하나요???? elseif 와 else중 어느것을 여러개를 써야하나요?

    • PinkWink 2010/11/29 11:45

      조건이 여러개면 당연히 elseif 가 여러개 사용이 되겠지요..
      그런데 '섯다'가 뭔가요???

    • matlabchobo 2010/11/30 12:53

      타짜보셨나요??? 타짜에서 주인공이 아귀와 하던 것입니다.
      화투패의 숫자들가지고 하는 게임입니다.
      저희 과제가 게임만드는 거라서요 ㅎㅎ

    • PinkWink 2010/11/30 15:48

      그 '섯다'가 맞군요...^^

  • 아톰 2010/11/24 19:11

    저는 왜 s라는 변수가 생성이 안되고
    ??? Undefined function or variable 'exception'. 라는 구문이 뜨는건가요?

    • PinkWink 2010/11/29 11:46

      음... 정말 죄송합니다. 단순히 에러코드만 말씀하시면 제가 (물론 답변을 다 드릴 수 있는 실력도 아니지만..ㅠㅠ) 답변을 드리기가 너무 어렵답니다...

  • 질문이요^^ 2011/03/31 20:44

    제가 임의로 만든 10*5 행렬에서 7의 배수를 골라내는 문제를 풀고있는데
    if 문을 써서 7로 나눴을 때 나머지가 0인 수만 골라내서 다시 행렬을 만들려고 합니다.
    if mod(a/7)=0
    이 다음부터 막히는데 어떻게 해야하죠?? 질문 드립니다..

    • PinkWink 2011/04/01 08:36

      http://pinkwink.kr/268 에서 설명한 반복문을 사용하시면 될것같습니다.

  • 불타는가슴 2011/05/10 17:12

    오늘두 잘 배우고 가네요 ㅎㅎ
    그동안 for문을 많이 사용했는데...많이 느리다니 for문을
    자제해야겠네요..

    • PinkWink 2011/05/11 07:55

      그래도 for를 사용해도 그리 몸으로 느낄 정도로 느린건 아닙니다.
      사실.. MATLAB을 좀 한다는 분들이 for문을 몹시 싫어하는 것을 저는 뭐.. 이해하기 힘듭니다.^^
      그냥 필요한 만큼 사용하면 되는 것일텐데 말이죠^^

  • K2 2011/08/11 21:22

    matlab강좌 잘 보고 있습니다...조건문과 반복문의 참고자료 끝에 있는 연습문제의 코딩을 좀 알수 있을까요??
    시간과 같은 연속적인 범위값에서 일정부분에서 다른 식을 적용하는 법을 잘 모르겠습니다...

    • PinkWink 2011/08/12 09:33

      오래전 일이라... 저도 코드는 가지고 있지 않습니다.
      죄송합니다.ㅠㅠ

  • K2 2011/08/12 10:57

    죄송합니다...그럼 하나만 더 질문할께요.
    t=0:0.01:1;
    T=0.5;
    if t>T
    y=0
    else
    y=sin(2*pi*t)
    end
    plot(t,y);

    y=sin(2*pi*t) 그래프가 그려지다가 t=0.5인 지점부터 y=0으로 하고 싶은데...
    모든 t의 값이 if조건에 맞지 않아서 y=sin(2*pi*t) 그래프만 그려지네요...
    어떻게 하면 y=sin(2*pi*t) 그래프가 그려지다가 t=0.5 지점부터 y=0으로 될까요??? 초보자라서...이리저리 해봤는데...잘 모르겠네요...

    • PinkWink 2011/08/12 11:35

      지금 제가 K2님께서 짜신 코드를 동일하게 만들어보겠습니다.
      t=0:0.01:1;
      y=sin(2*pi*t)
      plot(t,y);
      입니다. 이 세줄과 K2님이 짜신 코드는 동일한 코드입니다.

      왜냐하면, y변수가 애초 작성하신 코드에서 누적되어 저장되지 않았기 때문입니다.

      의도한 대로 하실려면
      y변수를 행렬로 선언하시고, 이전 같은 계속 보관하도록 해 두어야합니다.

  • 음음,, 2012/01/11 12:39

    반복문 중간에 매트랩 화면이 뜨지 않고 정지할때까지 화면이 보이지 않습니다. 혹시 이러한 현상에 대해서 해결책이 있나요?

  • 초보자 2012/03/27 00:46

    아까 1편에서 글쓰고 또 씁니다.
    아까전까지만해도 막막했던 MATLAB... 한 30분정도 씨름하니까 함수 감은 옵니다. 매우매우 감사드립니다 ㅠㅠㅠ

  • 우웅v 2012/07/04 06:37

    궁금한것이 하나 질문을 드립니다. tic toc 이나 etime 이 나오는 시간과 실제 시간이 상이한데 이것은 혹시

    무엇때문인지 궁금해서 이렇게 글을 남깁니다.

    어떤 실행문이 있다고 가정하에 개략적인 프로그램을 만들어보겠습니다.

    k=0;
    q=1;
    while q
    a=clock;
    x=1
    y=2
    z= x+y

    b=etime(clock,a)

    k=k+b;

    end

    k는 결국 계속 더해져서 시간의 누적을 표현하는것인데요.

    제가 해보니 etime이 더 빠르게 진행되어서요...

    혹시 무엇인가 제가 놓치고 있는게 싶어서 이렇게 몇자 글적여 봅니다...

    정의에서 보니 짧은시간과 날짜사이의 벡터라고 표현되어있는데....음... 정확히 이해가 안됩니다 ㅠㅠ

    • PinkWink 2012/07/04 14:34

      네.. 저도 알고 있습니다만, 정확한 차이는 모릅니다.
      tic-toc역시 수행할때마다 격차가 심하게 나니까요.

  • matlab은어려워 ㅠㅠ 2013/03/31 18:06

    설명을 쉽게 해주셔서 감사합니다 ㅠㅠ
    근대 아직 제가 하는거 잘 모르겟어요 ㅠ 하나 질문 좀 부탁드릴께요 ㅠ
    f = @(x) 1+5.25*x - 1/cos(sqrt(0.68*x))
    for x=0.1:0.01:4
    f(x)*f(x+0.01)<0
    end 여기서 증분법을 사용해서 x를 찾을려고 하는데 결과가 안나오네요 ㅠ

    • PinkWink 2013/04/01 09:00

      죄송합니다. 목적을 알 수 없을 정도로 의도를 파악하기가 힘듭니다.

  • Matlab 하수 2013/07/01 13:24

    여기에 있는 자료는 제가 계속 잘 보고 있습니다. 소중한 정보들을 알려주셔서 감사합니다.
    제가 지금 영상 분석 작업을 하기위해서 matlab을 사용하고 있는데요.
    어떤 영상을16*16개의 구역으로 구분시켜서 각각의 구역에 대한 분석을 진행해야 합니다.
    그런데 이 영상을 16*16개로 나눌 수는 있는데 이에 대해서 각각을 변수로 지정하는게 저는 어떻게 해야할 지 모르겠더라구요.ㅠㅠ
    예를 들어 영상을 16*16개로 나눈 제일 왼쪽 제일 위의 영상을 roi_1_1, 그 오른쪽의 영상을 roi_1_2....
    이런 식으로 지정해야지 되는데 이를 for 구문으로 지정하려고 하니 어렵네요.
    for 구문으로 나누기는 했습니다. 이를 지정하는 방법을 좀 가르쳐 주세요 ㅠㅠ

    • PinkWink 2013/07/01 14:26

      전체 크기를 모르겠습니다만,
      대략, 전체크기에서 16을 나눈 만큼을 for로 반복을 돌리고,
      그리고, 해당 위치마다, 저장을 하면 좋을 듯 한데요.
      만약 잘 모르시는 부분이 변수를 지정하는 부분이라면,
      matlab은 행렬안에 다시 행렬을 넣을 수 있습니다.
      혹은 eval이라는 명령을 사용해서 문자변수를 지정할 수도 있습니다.