강좌 순서

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)을 대상으로 합니다.



   폼나는 예제하나 만들어 보자 !  
 

이제껏 몇 회에 걸쳐서 GUI환경의 프로그램에 대해 이야기 했습니다. 지금까지의 연재 내용을 가지고 폼나는 뭔가를 한번 해봐야겠네요^^. 


이걸 만드는 거죠. 위에 보이다시피 진폭, 주파수, 위상차를 입력하면 그래프를 그리는 겁니다. 그냥 그리면 폼이 안나니까...^^ 한번 그리고, 또 AddFunction이라는 버튼을 누르면 '+'로 또 그리는 걸로 하죠. 괜찮겠는데요...^^


저렇게 그려줍니다. 또 다른 함수를 만들어서 AddFuncion을 눌러주면


저렇게 그려주는 거죠^^, 입력했던 수식도 글자로 나오고. 그림도 그리는....ㅋㅋ^^





   GUIDE에서 화면 구성 및 태그, 속성 결정 !  
 

일단 화면 구성 해야겠죠.


저렇게 EditBox 7개와 Axes 1개, sin과 cos을 결정할 PopMenu 1개와 Pushbuttion 1개를 배치합니다. 


이제는 프로그램이 조금 복잡해지니까 tag들을 변경해서 알기 쉽게 두도록 하죠. 윗 줄에 각 edit text들의 tag를 표시해두었습니다.


그리고, Popup Menu의 tag도 잡아주구요


그 다음 edit text 2개의 tag도 잡습니다. 그리고, Terms는 사용자에게 입력받을 것이 아니기때문에, inspector window에서 enable이라는 속성을 찾아서 off로 바꿔줍니다. 그러면, 프로그램에서는 string 속성을 만져서 글자를 바꿔줄 수 있지만, 사용자가 편집하지는 못합니다. 


그 다음 수식의 결과가 나오는 edit text의 태그와 enable 속성입니다. 앗.. 오타네요. Tag : dispEqu 입니다.


마찬가지로, 혹시 모를 에러코드를 표현할  edit text입니다. 나머지 언급하지 않은 것은 모두 static text입니다.




   Call Back 함수 작성하기 !  
 

사용자가 입력을 완료하고 Push Button을 누르면 그리도록 할 것이니 Push Button의 CallBack함수에 모든 코드를 위치시키겠습니다.


먼저, edit text, popup menu에서 이미 언급한데로 변수와 함수종류를 받아(get)옵니다. 


이게 기본 뼈대인데요. 제일 첫 줄은 sin이나 cos이 더해지는데 각 항 별로 시간축의 범위가 다르면 이상하겠죠.? 그래서 한번 입력하고 나면, 다시 종료시간을 수정할 수 없도록, enable속성을 off로 강제로 두는 겁니다.

그리고, 그림은 항수(많으면 귀찮으니까)가 4개이하로, 진폭과 주파수가 '0'이 아닐때, 그리도록 하는 것입니다. 나머지 상황은 에러코드로 정의해둡니다. 그렇다면, MAIN CODE라고 되어있는 부분과 Error CODE라고 되어있는 부분만 건드리면 되겠네요.


항수를 체크하기 위해 count를 세는 것입니다. 그리고, 그 다음줄은 화면에 항 수를 넣어두구요. 그리고, 사용자의 입력 수식의 이전결과가 dispEqu 태그의 edit text에 있을테니 그걸 가져 오는 겁니다. 만약 첫 항이라면, Nothing이라는 값이 있을테니, 그런 경우는 공란(' ')으로 두도록 되어있구요. 그리고 뒤에 '+'기호를 넣어두는것이죠. 역시 설명한 적이 있는 eval 명령을 이용해서 전체 수식을 만드는 부분입니다. 이 코드 그 다음에는


실제 그림을 그리는 부분이 들어갑니다. subs명령이 보이는데요. 이는 문자열중에서 문자 't;를 변수 t로 변환시켜줍니다. 따옴표(')가 있고 없고의 차이죠^^. 그러면, y에 바로 수식의 결과값이 저장되는 거죠.

나머지는 그려주는 건데요. 'ylim'속성에 1.1을 곱한 이유는 보기 편하게 10%의 여유를 둔 것입니다.


그리고, 에러코드는 해당하는 순서대로 문자열로 저장해두고 호출하는 방식입니다.

이렇게 하면 끝났네요^^

fig 화일은 
이구요. m화일은
입니다.
음... m화일의 전체코드는

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

Amp = str2double(get(handles.Amp, 'String'));
Freq = str2double(get(handles.freq, 'String'));
PhaseShift = str2double(get(handles.PhaseShift, 'String'));
endTime = str2double(get(handles.endTime, 'String'));
count = str2double(get(handles.count, 'String'));
contents = cellstr(get(handles.targetFunc, 'String'));
TargetFunc = contents{get(handles.targetFunc, 'Value')};

set(handles.endTime, 'enable', 'off')

if (count>=0)&&(count<=3)&&(Amp~=0)&&(Freq~=0)
    errorCode = 1;
    count = count + 1;
    set(handles.count, 'String', count);
    preEqu = get(handles.dispEqu, 'String');
    if strcmp(preEqu, 'Nothing')
        preEqu = '';
    else
        preEqu = eval([' '' ' preEqu ' + '' ']);
    end
    reEqu = eval([''' ' preEqu '' num2str(Amp) '*' TargetFunc '(2*pi*' num2str(Freq) '*t +' num2str(PhaseShift) ') ''']);
    set(handles.dispEqu, 'String', reEqu);
t = 0:0.01:endTime; y = subs(reEqu, 't', t, 0); plot(handles.axes1, t, y) set(handles.axes1, 'xlim', [0 endTime], 'ylim', [min(y) max(y)]*1.1, 'xgrid', 'on', 'ygrid', 'on') elseif count>3 errorCode = 2; elseif Amp==0 errorCode = 3; elseif Freq==0 errorCode = 4; end ErrorMsg = {{'Correct Expression'} {'Too many terms'} {'Amplitute is ''0'''} {'Frequency is ''0'''}}; set(handles.ErrorCode, 'String', ErrorMsg{errorCode});
입니다.^^



이제 길었던 MATLAB 기초연재를 마무리 합니다. 뭐 어차피 제 블로그의 MATLAB 카테고리에서는 계속 MATLAB이야기를 하겠지만 말이죠^^.

http://pinkwink.kr/trackback/299 관련글 쓰기
  • ^^ 2010/05/10 18:15

    앗.. Selecet 라고 오타^^
    연재글 감사히 잘 보고있습니다~!!

    ps.. 앗.. 교정하셨군요^^;;

  • Woohyun_ 2010/05/10 23:43

    파일이름변경하려면 어떻게해야하나요?^^

  • woohyun_ 2010/05/11 14:23

    guiTestv2라는 파일 이름을 변경하려구요~~ㅎㅎ

    • PinkWink 2010/05/11 14:45

      글쎄요.. 그냥 다른이름으로 저장하면 안되든가요???
      전 한번도 안해봐서 잘 모르겠네요...

  • 김주현 2010/05/13 05:20

    eval에서 '(작은 따옴표) 찍는 것이 저는 엄청 헷갈리네요.. 아무튼 잘 보고 갑니다.

  • Seung-Yeol Ryoo 2010/08/08 22:46

    궁금한점이 있는데요~혹시 GUI창을 인터넷 익스플로러 창처럼 한창에 여러개의 탭을 구현하는 것이 가능할까여? 각각의 탭을 클릭할때마다 그에따른 서로다른 창이 나올수있게요~

    • PinkWink 2010/08/09 00:20

      탭기능을 구현한 프로그램은 본듯한데.. 어떻게하는지는 잘 모릅니다. (제가 잘못본것일 수도 있구요...ㅠㅠ) MATLAB Central 에서 한번 찾아보시는것도 괜찮을 듯합니다.

  • Seung-Yeol Ryoo 2010/08/09 19:58

    진작 이생각을 왜 못했는지~MATLAB Central에 가보니 비슷한 파일이 있네요~^^ 감사해용!

  • 고등어조림 2010/11/02 16:21

    질문있습니다!!
    여기서 보구 잘 하고 있는데요
    이상하게 gui에서 실행하면 그래프가 안떠요
    따로 m-file 만들어서 그걸 실행하면 뜨는데
    무슨이유일까요??

    • PinkWink 2010/11/02 18:14

      plot(handles.이름, X데이터, Y데이터)의 형식으로 그래프 그리는 창을 지정해 주셨나요?

  • 고등어조림 2010/11/02 18:59

    네. 자꾸 안나와서 따로 m file 만들어서 plot(x,y) 하면 뜨는데요
    gui 안에서 plot(handles.plot1,x,y)이렇게 하면 안뜨네요 ㅎ;;
    배열이 들어갔는데 그거때매 그런지;;

    • PinkWink 2010/11/02 19:44

      plot1이라는 이름은 정확한거겠죠?? ^^ 처음 시작하면 디폴트로 axis1인가 axes1인가로 되어있잖아요...^^ 혹시나 하구요...

  • 고등어조림 2010/11/02 21:04

    네 처음엔 axes1으로 지정되죠..ㅎ;
    이유가 뭔고 ㅎ;;;

    • PinkWink 2010/11/03 10:36

      이럴땐 저도 참 슬픕니다. 제가 별 도움이 되지 않을때 말이죠...ㅠㅠ

  • GUI초보 2010/12/02 23:36

    연재글 잘 봤습니다.^^ 근데 궁금한게 있는데요.~ 그래프를 두개가 동시에 뜨게 하려면 어떻게 해야하죠??

    • PinkWink 2010/12/03 01:13

      hold 옵션을 on 하시면 됩니다.

    • GUI초보 2010/12/03 21:57

      답변 감사합니다.ㅋ 근데 제가 궁금한건 두개의 axes 창에 다른 그래프를 동시에 출력하는 거예요.ㅜㅜ

    • PinkWink 2010/12/03 22:52

      음.. 뭐.. 그러시다면...
      axes두개를 GUI상에서 그리고
      해당 속성 axes1, axes2 처음엔 이렇게 되었을텐데..
      그 해당 속성에 그냥 plot을 하시면 될텐데요....
      그냥
      plot(axes1, X1, Y1)
      plot(axes2, X1, Y1)
      이렇게.. 하면.. 두 창에 모두 그려저있을겁니다.

    • GUI초보 2010/12/04 00:34

      음...또 답변 감사드립니다.~~ 근데 안되네요..ㅜㅜ이런.........................................

    • PinkWink 2010/12/04 00:40

      아...
      plot(handles.axes1, X1, Y1)
      plot(handles.axes2, X1, Y1)
      이렇게요...ㅠㅠ

    • GUI초보 2010/12/04 00:45

      와우~~~바로바로 답변 올려 주시다니...울트라캡쑝짱 감사~~ 이제 되네요~~~ㅋㅋ 완전 감사드려요~~^^

    • PinkWink 2010/12/04 01:50

      우연히 블로그자료를 정리중이었거든요..
      아무튼 해결되셨다니 다행입니다.

  • 알랭이 2010/12/04 16:29

    질문드립니다 ㅎㅎ

    gui로 버튼을 만들고 한번 누를때마다 x = x + 1 이 되어

    axes1 그래프에 좌표가 하나씩 늘어가는 걸 구현하려고 하는데 어떻게 해야될지 ;;

    이렇게도 해보고 저렇게도 해봤는데 잘 안되서 질문 남깁니다.ㅠ

    • PinkWink 2010/12/04 17:56

      말씀하신 질문은 제 연재를 보고 직접 구현하시는 방법을 찾아보셔야할듯합니다. 일단 댓글로는 질문에 답변을 드리는데 한계가 있고.. 최근의 여러 포스팅에서 말헀지만.. 제가 지금은 너무 바쁘거든요^^

  • 안녕하세요 2011/05/22 14:07

    궁금한게 하나 있는데
    fig창에서 pushbutton을 누르면
    새로운 fig창이 하나 더 뜨게 어떻게 하나요?ㅜ
    알려주시면 감사하겠습니다^^

    • PinkWink 2011/05/22 14:54

      단순히
      이름 = figure라고 하고시 추후 그 이름을 호출하시면 될것같습니다만.
      만약 다른 GUI를 호출하신다면 같은 path에 저장한 해당 함수를 호출하면 되구요.

  • 공신 2011/05/24 20:35

    강의 잘 보았습니다. gui로 만든 창에서 계산을 해서 값을 나오게 하였습니다. 이 값을 매트랩을 처음 열었을때의 Workspace (BaseWorkspace인가요?) 창에 변수를 생성하여 그안에 값을 넣게 하고 싶습니다. 그런데 너무 어렵네요.
    ee=3
    set('workspace/ee','value',ee)
    이런식으로 해보았는데 잘 안됩니다. 어떻게 하면 될까요 ㅠ

    • PinkWink 2011/05/25 18:35

      심플하게 구현하고 싶다면 글로벌로 변수를 선언하시면 됩니다.^^

  • 정현 2011/05/27 03:36

    연재 잘 보고 있습니다. 큰 도움이 되고 있네요. 궁금한게 하나 있습니다.
    Axes 창이 있고, Push 버튼을 통해 Axes 에 있는 여러개의 Object 들을 각각 애니메이션 하려고 하는데, 가능 할까요? handles 를 통해서 접근 가능한 객채는 어디까지 인가요? 유저가 임의로 정한 객체에도 접근이 가능할까요?
    이제 GUI 시작하는데, 너무 어렵네요... 부탁 좀 드리겠습니다.

    • PinkWink 2011/05/27 08:28

      Axes에는 정말 많은 object들이 있습니다. 그에 대해 자세히 알려면 역시 matlab자체의 doc에서 GUI - axes의 속성 문서를 참조하시는 것이 좋을 듯합니다. 어감으로 봐서는 그 중에서도 각 그래프(혹은 그림)를 애니메시션으로 처리를 하고싶다는 말씀이신듯한데, 움직이고자 하는 것만 애니메이션 처리가 가능합니다. http://pinkwink.kr/284를 보시면, 어떤 그림은 움직이고 어떤건 고정이 되어있습니다.

  • 궁금 2011/06/09 11:31

    올리신 글 잘보았습니다.
    하나의axes에 여러개 푸시버튼으로 그래프를 못그리나요?
    그리고 푸쉬버튼 클릭해서 새로운 파일 띄우는 방법 좀 알려주시면 감사하겠습니다. 부탁드립니다

    • PinkWink 2011/06/10 07:51

      여러개의 푸시버튼은 가능합니다.
      새로운 화일을 띄우는 것은 새로운 화일이름을 호출하시면 됩니다.
      명령어가 run이었는지는 잘 기억이 안나네요.

  • GUI 오늘 시작 2011/08/18 16:33

    안녕하세요
    글 잘읽었구요 실습도 해봤습니다. 감사합니다.
    그리구여....
    GUI에 대해서 궁금한게 있는데요
    혹시 push butten을 누르면 팝업창 뜨면서
    제가 저장한 텍스트 파일의 경로를 찾아서 더블 클릭하면
    아래 List box에 그 텍스트가 쭉 나열되게끔 하는게 가능한가여?
    그래서 그 텍스트가지고 플롯을 하려고 하거든여.....
    정말 초보여서 이런게 가능한지 궁금합니다.

    • PinkWink 2011/08/19 10:07

      안될것 없다는 생각이 살짝 듭니다만, 실제 구현은 저도 해보지 않았고, 가능성을 타진할려면 help나 document를 찾아서 관련 명령들로 스토리를 짜봐야할 듯합니다.
      해보지 않아 뭐라 드릴 말씀이 없네요...ㅠㅠ

  • GUI 오늘 시작 2011/08/19 11:53

    넹,,, 감사합니다,,

  • MATLAB제발!!! 2011/09/06 01:49

    안녕하세요! 여기저기 찾아보다가..궁금한 사항이 있어서 질문드립니다.

    제가 이번에 AVR과 매틀랩 간의 통신을 해서 근전도 신호처리를 할게 있는데 통신에서 막혀버려서..

    제가 궁금한 것이 무엇이냐면..
    avr에서 지속적으로 데이터값을 계속 송신해 주면
    그것을 매틀랩 GUI 그래프 창에 계속적으로 그려주는 것을 하려고 합니다.
    avr에서는 지속적으로 printf를 써서 숫자를 보내는것을
    코드비젼으로는 확인하였는데 매틀랩에서 그래프를 그려보자니 영 방법을 모르겠습니다..
    이거 보시면 꼭 알려주시면 감사하겠습니다.ㅠ

    그냥 간단예제로 본것은


    for i=1:1000
    plot(i,i,'b.');
    hold on
    drawnow;
    end




    이처럼 hold on과 drawnow를 써서 그냥 커맨트 창에서 구현 한 것인데요..

    제가 궁금한거는..



    gui창에서 push버튼을 눌렀을때 통신이 연결되면서,

    하나의 변수에 수신된값이 들어오면, 그것을 계속적으로 그래프창에 그려주는 것입니다.

    이것을 해결하기가 쉽지가 않네요..;


    이것 보시면 제발 꼭 알려주시면 감사하겠습니다.

    • PinkWink 2011/09/06 09:14

      MATLAB에서 serial 통신을 해서 수신된 데이터를 GUI환경에서 그래프로 표현하고 싶다는 말씀이시군요.
      먼저 MATLAB에서 시리얼 통신이 되는지를 확인하시기 바랍니다.
      document에서 serial이라고 검색하시면
      간단히 serial 환경을 세팅하고, 통신하는 방법이 나와있습니다.
      저도.. 아주 오래전이라 기억이 나지 않지만,
      당시에 저도 document에서 serial통신이라고 검색해서 찾았던것 같습니다.

  • MATLAB제발!!! 2011/09/07 20:26

    COMPORT = 'COM1';
    s = serial(COMPORT,'BaudRate', 9600, 'DataBits', 8, 'parity', 'none','stopbits',1);
    fopen(s)
    을 이용해서 연결을 하고
    y=fread(s)
    를 통해서 y에 통신값이 저장되는 것을 봤습니다.

    하지만 두가지 궁금한점이 또 생겼는데요..;
    통신을 통해 매틀랩에서 받은 값은 아스키 값으로 들어오는 것 같습니다.
    코드비젼 시리얼통신값은 십진수값이 들어오는 것을 확인했었는데
    매틀랩은 32~57의 범위가 뜨더라구요..
    혹시나해서 송신에 1을 날렸는데 1의 아스키코드값인 49가 출력되었습니다.

    매틀랩에서 아스키값을 십진수로 바꿔받으려면 어떻게 해야 하는 것인가요?;


    또 실시간으로 그래프를 그려주기 위해서는 어떻게해야하나요?
    지금은 버튼누르면 for문에 한계치 범위를 정해놓고 그만큼만 그리게 해놨는데
    인위적으로 통신을 종료할때까지 무한히계속 그리게 하려면 어떻게 해야 하나요?

    또 여태까지는 y라는 변수 하나에 한채널의 데이터 값을 받아서
    그것을 그대로 그리기만 하였는데요,
    만약에 y라는 변수에 1개의 채널이 아니라 4개의 채널에 해당하는 십진수 값을
    1바이트에 싣어 보내고 그것을 나눠서 매틀랩변수에 저장하는 것은 어떻게 해야 하나요?

    왜냐면 제가 8개의 채널에 해당하는 근전도 값을 동시에 실시간으로 그래프를
    그려야 하기 때문에 이런 질문 드립니다.;

    • PinkWink 2011/09/09 10:56

      아스키값을 문자로 변환해주는 함수가 있을것 같습니다. 뭐 모른다고 해도, case문으로 바꿔주면 되니까 큰 어려움은 아닐것 같구요.
      변화하는 값을 계속 그래프로 표현하고 싶으시다면, 간단히 테스트를 해보시면 됩니다.
      figure를 하나 열고, 간단히 hold on을 시킨다음, 계속 그림을 그리라고 command창에서 명령을 줘보시면, 확인하실 수 있습니다. 이 간단한 방법이 괜찮다면 그대로 사용하시면 되구요.
      표현상에 문제가 있어보인다면, 사실, figure의 속성을 어마어마하게 파야하는 일이 생길 수도 있습니다.

  • yoonsmith 2011/10/18 15:56

    정말 큰도움을 받고 있습니다.
    제가 해야할게 시간에 따라 2개의 어떤 값을 한 그래프에 plot 해야 하는데,
    시간에 따라 x 축이 변하게 하여 시간에 따른 값들을 그래프상에서 보여주고 싶습니다.(real time 으로..) 이럴땐 어떡하면 좋을까요 ? 도저히 감이 오지 않네요 ㅠ

    axes가 하나 있을 경우 for 문으로 xlim 을 변화시켜 시간에 따라 변화하는 그래프를 그리는데 성공하였는데 axes 하나를 더 추가하면 두개의 값중 하나만 그래프에 plot 되네요 ㅠㅠ

    function pushbutton1_Callback(hObject, eventdata, handles)
    t=0:0.1:10000;
    y1=5+sin(2*pi*t);
    y2=5+cos(2*pi*t);
    plot(handles.axes1,t,y1)
    hold on
    grid on
    plot(handles.axes1,t,y2,'r')

    set(handles.axes1,'ylim',[3 7])
    set(handles.axes1,'xlim',[0 5])

    %plot(handles.axes3,t,y1)
    %grid on
    %set(handles.axes3,'ylim',[3 7])
    %set(handles.axes3,'xlim',[0 5])
    for i=0:0.1:20
    temp1=i;
    set(handles.axes1,'xlim',[temp1 5+temp1]);
    drawnow;
    end

    • PinkWink 2011/10/18 20:22

      글쎄요. 저도 잘 모르겠습니다.
      테스트를 해서 분석해보면 되겠지만,
      현실적인 시간이 그걸 허락해주질 않는군요.
      (요즘 무쟈게 바쁘거든요)
      도움이 되지 못해 죄송합니다.

  • yoonsmith 2011/10/19 11:35

    시간이 걸리더라도 제가 해결해보겠습니다 ㅎㅎ

    한가지 여쭙고 싶은건 GUI 상에서 실시간으로 모니터링 하는게 목표입니다.

    앞서서는 for 문을 통해 그래프의 x축(시간)을 이동해주는 거처럼 보여주며 비슷하게 구현하였는데요..

    실제로 이 x 축이 실제 시간과 같이 움직이면서 그래프를 보여주려면
    프로그램 내부 혹은 컴퓨터의 내부 clock과 연결이 되어야 한다고 생각하는데
    매틀랩에서 실시간으로 구현하는게 가능 할까요 ? ㅠ

    • PinkWink 2011/10/19 12:38

      다른말은 다 빼고. 실시간 모니터링만 생각해보겠습니다.
      어느정도 실시간인가 하는 문제가 있지만,
      외부에서 데이터를 받아 오는 거라면,
      MATLAB도 시리얼통신을 지원합니다.
      시리얼통신을 통해 데이터를 수집하고 가공이 가능합니다.
      흔히 말하는 RTOS수준의 실시간이라면
      그것은 MATLAB의 문제가 아니라 윈도우의 문제(윈도는 실시간 OS가 아니니까요)로 힘들 수도 있습니다.
      (물론 MS에서 실시간 모듈을 배포하는 것으로 알고 있지만)
      그 이외에 말씀하신것처럼 clock과 for를 사용한다는 것은 살짝 이해가 되지 않습니다.
      흔히 실시간모니터링이라는 것은 외부데이터를 수집하고 가공하는 것을 데이터수집시간에 맞춰 실시간으로 수행하겠다는 의미이지 않나요?

  • yoonsmith 2011/10/20 14:14

    답변 감사드립니다. 아직 시뮬레이션 단계라서 아직은 외부데이터를 받지 않고 임의의 그래프(sin cos)를 실시간으로 변화하는걸 그리고 있어요.ㅎ
    x축을 시간축으로 삼아서 x축의 이동속도가 실제 시간과 같게 하는걸 찾고 있거든요. ㅎ for문에서 i 간격을 조절해서 계산양을 늘려 그래프가 실제시간과 비슷하게 움직이는 거 같은 착시? 현상을 구현하긴 하였는데, 실제 시간과 같이 움직이게 하려고 이거저거 찾아보고 있었어요. timer나 tic toc 을 쓰는거 같아서요.

    시뮬링크를 보니 직접 block 을 만들어서 하는 법도 있더군요. (http://www.mathworks.co.kr/matlabcentral/fileexchange/21908-simulink%C2%AE-real-time-execution)

    제가 사실 기계공학 전공이라 매틀랩을 거의 처음 다뤄보는데 어렵네요. RTOS 이런 단어 너무 생소하네요 .ㅠ

    • PinkWink 2011/10/20 23:40

      네 그렇군요. 그렇게 연습하시는거라면. 딱히 제가 드릴 말씀이 별자르게 있지는 않는것 같습니다^^.
      그래도 좋은 공부를 하고 계시는 군요. 역시 좋은 성과가 있으시기를 빕니다^^

  • 박선미 2012/02/05 22:39

    안녕하세요.matlab을 공부하는 학생입니다.
    이번에 매트렙GUI로 그래프를 그려야하는데 잘 모르겠어서요;;
    그래프를 원의 바깥쪽으로 등각도로 24개를 그릴 예정인데 2-D로 그래프의 축도 같이 돌아가야 하는거든요. 그런데 그래프의 축 자체를 돌리는 것을 어떻게 해야 하는지 잘 모르겠습니다. 인터넷을 찾아봐도 나오는 것이 없구요..지금 책을 보고 있긴 한데 책에도 자세히 안나와 있습니다..ㅠㅠ 뎃글 보시면 답변 부탁드립니다..ㅠㅠ

    • PinkWink 2012/02/06 08:32

      글쎄요. 그림이야 그냥 돌리면 되지만 기준축도 돌려야한다는 말씀이신가요?
      도큐먼트에서 3D rotation으로 한번 검색해보시는걸 권해드립니다.
      예전에 rotate3d라는 명령이 있었던것 같은데, 그게 의도하시는 기능이 정확히 맞는진 자신이 없네요.

  • David 2012/03/16 12:12

    안녕하세요 여기서 너무 많은 것을 알아가서 너무 감사드립니다.
    거의 대부분의 것을 강의를 보면서 해결했습니다. 정말 감사드립니다.
    그런데 제가 궁금한 것이 있는데요. 제가 워낙 matlab을 잘 몰라서 간단할 것 같은데 잘 모르겠네요;;;

    보통 GUI 구성한 것 말고 일반 m 파일에서는 파일을 돌렸을 때의 변수가 Workspace에 표현이 되잖아요.
    그런데 GUI 구성이후에는 뜨지 않더군요.
    이것을 Workspace에 나오게 할 수 없나요?
    지금 제가 한 작업이 영상의 일부분을 네모로 잘라서 그 각각의 column 들의 평균값을 구한 후 그것을 plot하는 작업을 했는데요.
    여기서 평균값을 구한 것의 각각의 값을 알아야 합니다. 그런데 그것을 표현해내기가 쉽지 않네요.
    Workspace에 뜨게 할 수 없다면 GUI 상에서 간단하게 표현할 수 있는 방법이라도 알고 싶네요ㅜㅜ
    부탁드리겠습니다. 감사합니다.

    • PinkWink 2012/03/16 14:39

      네... GUI는 함수내부에서 설정된 변수들이라 workspace에 나타나지 않습니다. 방법들이 많겠지만, 가장쉽게 접근할 수 있는 방법이 global로 선언하는 겁니다.
      global 변수이름
      이렇게 두시고, 사용하시면 됩니다.

  • sumi 2012/05/17 16:16

    안녕하세요. gui를 이용하여 프로젝트 중인데 이곳에서 많은 정보를 얻어 도움이 많이 되었습니다.
    혹시 gui를 이용해 어떤 계층의 구조화(hierarchy)를 나타낼 수 있는 지 궁금합니다.
    axes에 phytree함수를 이용하여 표현하려 하였으나 제가 생각하기에는 2진트리로 최적화 되어있는 것 같아
    제가 원하는 계층 구조를 나타낼 수가 없습니다.ㅜㅜ 뻗어나가는 가지들을 3개씩으로 하고 싶은데 아무리 해도 방법이 없네요 ㅜㅜ 혹시 방법 알고계시면 답변 부탁드려요 . 감사합니다.

    • PinkWink 2012/05/18 11:57

      ㅎㅎㅎ 죄송합니다. 좀금더 풀어서 설명해주시면 제가 질문은 이해할 수 있지 않을까합니다만, 그래도 답을 드리기는 어려울 것 같습니다. 잘 모르는...ㅠㅠ

  • belloth 2013/11/17 16:20

    안녕하세요. 블로그 정말 큰 도움이 되고 있습니다!
    근데 막히는 부분이 있어서 하나 질문하려구요!!

    지금 GUI를 이용해서 figure 하나를 만들었습니다. 그런데 GUI를 이용해서 하나의 figure2를 더 만들고
    figure1에서 구해지는 어떠한 값을 figure2에서 나타내려고 합니다.
    예를 들면 figure1에서 숫자 5라는 값이 나왔습니다.
    그러면 이 값을 figure에서 5가 상승하는 막대그래프를 그리려는.. 대충 뭐 이런 생각인데요

    그럼 여기서, figure1에서 push버튼을 이용해서 figure2를 실행시킬 수 있을까요? 있다면 어떠한 코딩을 해야할까요?
    그리구 figure2가 실행이 되었다면 어떻게 figure1에서의 값을 받아올 수 있을까요..??

    너무 두서없이 쓴거같은데 답변 가능하시다면 부탁드립니다.. (--)(__) !!

    • PinkWink 2013/11/17 16:50

      네... 잘 모르겠습니다. 변수를 받는데 꽤 어렵다면 가장 쉽게 할 수 있는건 그냥 글로벌 변수로 선언해서 사용하는겁니다.

  • ojshero 2014/03/31 02:03

    안녕하세요 블로그가 진짜 큰 도움이 되고 있습니다
    한가지 데이터저장을 어떻게하는지 궁금합니다.

    gui에서 계산된 값이 workspace에서 확인을 할수 없기에 이것들을 텍스트파일같은것으로 저장하고싶은데요

    gui에서 계산한 값을 워크스페이스상에서 확인하거나 아니면 텍스트파일로 저장할 수 있나요??

    gui 코딩에서 save 파일이름 변수명 -ascii 하니깐 안되더라구요 ㅜㅜ

    도와주시면 감사하겠습니다.^^

    • PinkWink 2014/03/31 13:05

      함수 내부에 있는 변수를 확인하고 싶다는 것이죠...
      급하게 제일 간단히 쓸 수 있는건 저장하고 싶은 변수를 함수밖에서 글로벌로 선언해 버리는 겁니다. global이라는 단어를 변수앞에 달아주시면 되지요^^

    • ojshero 2014/03/31 13:31

      답변감사합니다. 저 그런데 제가 잘못선언한 것인인지 글로벌선언이후에도 워크스페이스상에 아무런 변수가 생성되지 않습니다. ㅜㅜ

      참고로 코딩은 아래와 같이 하였습니다. 바쁘시지 않을때 답변주시면 감사하겠습니다.

      global Matr;
      function pushbutton1_Callback(hObject, eventdata, handles)

      [변수선언문] e.g. input=str2double(get(handles.input,'String'));
      [계산식 선언문] e.g. force=2*input
      [그래프출력선언문]
      e.g. set(handles.force,'String',force)
      plot(handles.axes1,input, force)

      [워크스페이스 확인용 선언문] e.g. Matr=[input force];

      와 같이 하였구 그래프를 통해서 그래프출력문까지는 문제가 없음을 확인하였습니다. 그리고 매트랩 커맨드윈도우창에서 아무런 에러메세지 또한 없네요 ^^;

    • PinkWink 2014/04/02 09:23

      아이쿠 저런~ 제가 지금 일하는 곳에 MATLAB이 깔려있지 않아서ㅠㅠ
      커맨드 창에서

      doc global

      이라고 해서 예제를 한 번 보세요. 현재는 제가 테스트를 해서 확인할 만한 연건이 되지를 않습니다. 좀 있음 괜찮아질듯하지만^^

  • baracksj 2014/04/07 14:05

    안녕하세요!
    제가 공부하는것이랑 위의 글이랑 관련이없는데,, 이것저것 찾아보다가 모르겠어서
    이렇게 글을 남깁니다.

    저는 xyz 축을 갖는, 즉 3-D 에 제가 원하는 점에 어떤 이미지를 띄우고싶거든요....
    이것을 하려면 올려주신자료에서 어떤 부분을 참고해야할지요?

    • PinkWink 2014/04/07 18:22

      MATLAB Document에서 plot3를 보시면 될듯합니다.
      MATLAB의 Help 문서에서 3D plot으로 검색하셔도 되구요^^

1 ... 22 23 24 25 26 27 28 29 30 ... 59