如何在Matlab中使用更新的输出循环子图?

时间:2016-03-02 18:56:06

标签: matlab data-visualization subplot

我想创建一个前端,用户可以按Enter键向前浏览图片。 伪代码

hFig=figure
nFrames=5;
k=1;
while k < nFrames
   u=signal(1*k,100*k,'data.wav'); % 100 length

   subplot(2,2,1);
   plot(u);

   subplot(2,2,2);
   plot(sin(u));

   subplot(2,2,3);
   plot(cos(u));

   subplot(2,2,4);
   plot(tan(u));

   % not necessary but for heading of overal figure
   fprintf('Press Enter for next slice\n');
   str=sprintf('Slice %d', k);
   mtit(hFig, str); 

   k=k+1;
   keyboard

end

function u=signal(a,b,file)
   [fs,smplrt]=audioread(file);
   u=fs(a:b,1);
end

其中

  • 更新数据时出现问题,因为按CMD + Enter会将k增加1,但不会更新数据。有时(很少),数据一次是下一次迭代。
  • 由于k可能比nFrame更大,因此
  • 条件有问题。 keyboard只是不断要求更多投入。

我之前在错误检查中的错误

我之前遇到过一个问题,即窗口关闭会导致应用程序崩溃。我在这里包括这个,因为我在一个答案的评论中提到了一个问题。

我现在避免了这个问题
hFig=figure;
n=5;
k=1;
while k<nFrames 

      % for the case, the user closes the window but starts new iteration
      if(not(ishandle(hFig)))
          hFig=figure;
      end

   ...

end

如果用户关闭了前一个图,则会创建一个新图。 我尝试将hFig=figure;放在while循环的if子句中,但是没有成功,以避免在代码中重复。 如果您知道为什么在while循环的if子句中没有句柄hFig,请告诉我。

如何在Matlab中使用更新的输出循环子图?

1 个答案:

答案 0 :(得分:2)

要停止脚本等待用户的输入,您应该使用input而不是keyboard

实际上keyboard会使您的脚本进入debug模式。它会停止脚本的executino(如breakpoint),允许用户检查变量的值。

您可以按如下方式修改脚本(修改位于脚本的末尾,由“更新的部分”标识):

hFig=figure
nFrames=5;
k=1;
while k < nFrames
   u=signal(1*k,100*k,'handel.wav'); % 100 length

   subplot(2,2,1);
   plot(u);

   subplot(2,2,2);
   plot(sin(u));

   subplot(2,2,3);
   plot(cos(u));

   subplot(2,2,4);
   plot(tan(u));

   % not necessary but for heading of overal figure
   %
   % UPDATED SECTION
   %
   % Use the string "Press Enter for next slice\n" as the prompt for the
   % call to "input"
   %
   % fprintf('Press Enter for next slice\n');
   % str=sprintf('Slice %f', k);
   % Use %d instead of "%f" to print integer data
   str=sprintf('Slice %d', k);
   mtit(hFig, str); 

   k=k+1;
   % Use "input" instead of "keyboard"
   % keyboard
   input('Press Enter for next slice\n')

end

希望这有帮助。

Qapla'