본문으로 바로가기

MATLAB GUI에 대해서 어줍지 않은 실력임에도 불구하고 연재랍시고 올린게 벌써 4년전이네요^^

그때는 참 프로그램 공부하는 것이 재미있었는데요^^. 오랜만에 기억을 되살리며 뭔가 작업을 했네요. 그 중에 또 하나를 알려드릴까 하고 이렇게 간단한 글을 적습니다.^^. 바로 GUI내에서 사용하는 변수를 workspace로 보내는 건데요. GUI도 하나의 function이기 때문에 내부에서 사용한 변수는 MATLAB Workspace에 나타나지 않는데요. 아주 많은 경우에 그렇게 보고싶을 때가 또 있지요^^

첫 번째 방법은 assignin이라는 함수를 위와 같이 이용하는 겁니다. workspace를 지칭하는 말이 'base'구요. workspace에 tmp라는 변수명으로 현재 함수 내에서 사용하고 있는 tmp 변수의 내용을 저장하라는 말이지요. 저 Push Button을 누르면 말이죠. Push Button과 관련된 기초적 내용은 위에서 이야기한 연재를 확인해 주세요^^

그러고 나면 당연하지만 저렇게 workspace에 저장되어 있는 것이 확인 됩니다.

그런데 일반적인 방법은 위 그림처럼 global로 선언하는 겁니다. global로 선언하고 실행하면 되죠. 문제는 저렇게만 하면 workspace에 나타나지 않습니다.ㅠㅠ. 그래서 workspace에 이미 tmp라는 변수가 있어야합니다.

즉 위 그림처럼 GUI가 실행되기 전에 먼저 global로 원하는 변수를 선언해 두어야만 그 내용이 변경되는거죠^^. 사용해보면 두 방법 모두 뭐 장단점이 있습니다. 그냥 오랜만에 MATLAB으로 한 한시간 고민하고 나서 그 고민의 시작이었던 이 내용이 제 블로그에 없길래 살짝 언급합니다.^^


댓글을 달아 주세요

  1. BlogIcon 핑구야 날자 2014.09.25 12:20 신고

    그래도 자꾸 보다보니 눈에는 익는데 잘 모르겠어요.~~ㅋㅋ

    • BlogIcon PinkWink 2014.09.25 12:32 신고

      ㅎㅎ 요런 글은 그냥 거의 저 혼자 보는 페이지라고 봐야죠.. ㅎㅎ 간혹 잊어먹었을때 노트처럼 보는 것 말이죠^^

  2. BlogIcon 스칼렛 오하라 2014.09.25 12:22 신고

    잘보고 갑니다
    즐건 하루 ~~~

  3. BlogIcon 양군! 2014.09.26 06:56 신고

    필요하신 분들에게는..좋은 정보인듯
    잘보고 가요 ^^

  4. BlogIcon 복돌이^^ 2014.09.26 09:40 신고

    아아아~~ 머리가 지끈지끈...ㅎㅎ ^^어려워요^^
    다녀갑니다. 행복한 하루 되세요

  5. 방금지은이름 2015.10.07 23:24

    3시간 헤매다가 드디어 찾았네요 ㅠㅠ 고마워요

  6. 문지훈 2016.12.18 15:46

    내일까지 파이널프로젝트 제출인데,,,ㅠ GUI안에서 제가 만든 함수 호출하는데, 저방법을 써서 workspace에 저장하고 그다음에 실행을 하면 워크플로우대로 GUI 프레쉬버튼 콜백 안에서 입력값을 받아서 워크스페이스에 저장하고 코드아래에 앞에서말헀던 제가 만든 함수를 호출하면 그함수안에 방금 워크스페이스에 저장한 변수가 들어가서 코드가 실행이 되야하는데, 그 실행이 안되네요 ㅠㅠㅠ 어떻게해야하나요

    • BlogIcon PinkWink 2016.12.19 08:18 신고

      휴~.. 정말..정말 죄송합니다만....지금 질문을 한 문장으로 했다는 것을 알고 계신가요? 저의 부족한 이해력이 원인이니... 조금 쉽게 풀어서질문해 주시면 제가 이해할 수 있을 것 같습니다.

    • 문지훈 2016.12.19 10:18

      저가 화학반응을 확률적으로 현실에서일어나는 정량적반응을 하는 프로그램을 만들어야해요.
      ㅇ확률알고리즘으로 3가지 방법이들어가요. 이것들을 펑션으로 지정하고, GUI에서 버튼을 누르면 그래프가 그려지게 해야합니다. 그래서 GUI button callback부분에서 변수선언들을 하고 함수를 실행시켜야합니다. 그런데 함수안에서 변수를 인식을 못하네요.

      그리고 함수 안에서 function부분을 지우고 그냥 변수선언을 해주면 코드는 다 정상적으로 실행이되는데 구지 펑션으로 만들면 변수와관련된 에러들이 뜨네요, 선언이 안되있다던가 행렬차원이 안맞다던가, 이런걸 해결을 못하고있어요 ㅠㅠ
      근데 너무너무너무 급한데...6시까지 제출인데 혹시나 도와주실수있으신가요ㅠㅠ 진짜 초면에 죄송한데 혹시나 시간이 있으셔서 도와주실수 있으시면 01074088047 연락주실수있으세요?? GUI와 함수들을 이어주는 코드만 만들면 되는데 그걸 못하고있네요 ㅠㅠ

    • BlogIcon PinkWink 2016.12.19 11:44 신고

      죄송합니다. 말씀하신 부분은 함수 사용의 기초적인 부분일 수는 있지만, 조금더 들여다 보셔야할 듯 합니다.
      일단 callback 함수들도 함수들이므로, 전역(global) 변수의 선언들이 잘 되었는지, 그리고, 함수 입력 인자들이 잘 선언되었는지를 확인하셔야 할 듯 합니다.
      마지막으로, 저도 직장인이라.... 통화는 힘들답니다.
      도움이 되지 못했네요ㅠㅠ.

    • 문지훈 2016.12.19 12:55

      함수선언이나 입력인자들을 어떻게 보여드릴수잇을까요...
      % --- Executes on button press in run.
      function run_Callback(hObject, eventdata, handles)
      % hObject handle to run (see GCBO)
      % eventdata reserved - to be defined in a future version of MATLAB
      % handles structure with handles and user data (see GUIDATA)
      rand('state', 100)
      global V nA vol c stepsize t timef ensm
      V = [-1 1 0; -1 1 1; 1 -1 -1; 0 0 1];
      nA = 6.023e23; % Avagadro’s number
      vol = str2num(get(handles.vol,'string')); % volume of system
      c = [1e6/(nA*vol),1e-4,0.1];
      stepsize = 0;
      t=0;
      timef = str2num(get(handles.timef,'string')) ;
      ensm = str2num(get(handles.ensm,'string'));
      assignin('base','nA',nA)
      assignin('base','vol',vol)
      assignin('base','ensm',ensm)
      assignin('base','timef',timef)

      이건 이렇게 잘되어있는거같아요 그런데 함수안에서
      rand('state', 100)

      for k = 1:ensm
      X = zeros(4,1);
      X = [round(5e-7*nA*vol),round(2e-7*nA*vol),0,0]

      while t< timef
      a(1) = c(1)*X(1)*X(2);
      a(2) = c(2)*X(3);
      a(3) = c(3)*X(3);
      asum = sum(a);
      j = min(find(rand<cumsum(a/asum)));
      tau = log(1/rand)/asum;

      if(isempty(j)==1)
      break
      end

      X = X + V(:,j);
      t = t + tau;
      stepsize = stepsize +1;
      V(k,stepsize) = X(1);
      Z(1,stepsize) = t;

      end
      stepsize = 0;t =0;
      이코드를 실행시켯을때 저걸 그냥 복붙해서 하면 실행되는데 쥐유아이에서 펑션으로 사용하니 X = X + V(:,j); 여기서 행렬의 차원이 안맞다고하네요... 쥐유앙이가 문제인지 펑션이 문제인지 잘모르겟어요,,,, 왜 쥐유아이로넣엇더니 안되는건지...

    • 문지훈 2016.12.19 12:56

      그리고 지금은.... 함수가 정의가안되잇다고하는데 같은폴더안에
      tspan = [0 50]; yzero = [5e-7; 2e-7; 0; 0];
      options = odeset('AbsTol',1e-8);
      k1 = 1e6; k2 = 1e-4; k3 = 0.1;
      [t,y] = ode15s(@mm_rre,tspan,yzero,options);

      plot(t,y)

      전체함수



      function yprime = mm_rre(t,y)
      % MM_RRE Michaelis-Menten Reaction Rate Equation
      yprime = zeros(4,1);
      yprime(1) = -k1*y(1)*y(2) + k2*y(3);
      yprime(2) = -k1*y(1)*y(2) + (k2+k3)*y(3);
      yprime(3) = k1*y(1)*y(2) - (k2+k3)*y(3);
      yprime(4) = k3*y(3);
      end
      펑션함수
      가이렇게 있는데 지금

      'mm_rre'은(는) 정의되지 않은 함수 또는 변수입니다.

      오류 발생: odearguments (line 87)
      f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

      오류 발생: ode15s (line 150)
      odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

      이런오류가뜨네요....

    • 문지훈 2016.12.19 13:00

      펑션부분을 지우고 쥐유아이코드안에 붙여보니 그대로
      다음 사용 중 오류가 발생함: +
      행렬의 차원이 일치해야 합니다.

      오류 발생: button>run_Callback (line 213)
      X = X + V(:,j);

      오류 발생: gui_mainfcn (line 95)
      feval(varargin{:});

      오류 발생: button (line 42)
      gui_mainfcn(gui_State, varargin{:});

      오류 발생:
      matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)button('run_Callback',hObject,eventdata,guidata(hObject))
      UIControl Callback을(를) 실행하는 중 오류 발생
      이런오류가뜨네요......쥐유아이에넣으니까 차원의오류가뜨는데 왜그런거죠

    • BlogIcon PinkWink 2016.12.20 08:01 신고

      네.. 코드를 보고 검토해 볼 수는 있겠지만, 말씀드렸듯이 저도 야근하는 일상적인 직장인으로... 시간적 여유가 없답니다. 글의 범위안에서 원론적인 이야기만 드릴 수 밖에 없어 도움을 드리기 어렵네요.