【问题标题】:Matlab: Update waitbar without drawing plotMatlab:更新等待栏而不绘制绘图
【发布时间】:2015-03-24 13:57:33
【问题描述】:

我正在尝试绘制许多不同长度的单线。因此,我使用了一个相当简单的代码:

p = csvread('C:\path\file.csv',2,0,[2,0,1000000,3]);
h=waitbar(0,'Plotting...');
for r=1:size(p,1)
    waitbar(r/size(p,1),h);
    r0=r;
    t0=p(r0,4);
    while(r<=size(p,1) && p(r,4)==t0)
        r=r+1;
    end
    plot(p(r0:r-1,2),p(r0:r-1,3));
    hold on
end
close(h);

此代码遍历我的 csv 文件的每一行,并绘制从 r0r-1 的行,其中 p(r,4) 保持不变。我对看到每条线都被绘制不感兴趣,所以我希望 Matlab 在后台绘制所有内容,然后向我展示结果。由于该绘图需要相当长的时间,我希望在后台绘图时看到我的等待栏更新。

但有一个问题:每次等待栏更新时,都会绘制图表(类似于drawnow 命令)。与在后台绘图相比,这需要很多时间。 如何在不绘制绘图的情况下更新我的等待栏?

【问题讨论】:

  • 我建议不要在循环的每次迭代中更新等待栏,因为它的计算成本很高。相反,每 100 次迭代更新一次。使用模组功能。如果 mod(r,100)==0 .. 更新等待栏 .. 结束
  • 您是否尝试过一次全部绘制?这可能需要更多内存,但应该更快。
  • @patrik 的建议可能是你能做的最好的,如果你有能力将所有数据存储在一个数组中。
  • @patrik 为了一次绘制它们,它们需要具有相同的长度,不是吗?这当然是首选,但我还不能让它工作。我也尝试过每第 n 次迭代更新一次等待栏;我只是将其删除以使代码尽可能短。无论如何,这只是一种解决方法,毕竟不是灵魂。
  • @Dominic 好的,但是,我明白了,只是移动等待栏并指望不会绘制情节并不是很安全。这将使情节随机出现。此外,是的,waitbar 中有一个drawow :)

标签: matlab user-interface plot


【解决方案1】:

您可以使用set(h,'Visible','off'); 隐藏绘图,直到您需要查看它。但是,根据我运行的一些快速测试,这只会降低大约 25% 的速度。

例如:

h = figure(1);              %// get figure handle
set(h,'Visible','off')      %// hide plot window
hold on;
t = -10:0.1:10;             %// create curves on the plot
plot(t,sin(t),'b');         
plot(t,sin(t+2*pi/3),'r');
plot(t,sin(t-2*pi/3),'g');
set(h,'Visible','on');      %// draw plot

【讨论】:

  • 我想这是最接近的。在这种情况下,waitbarcommand 消耗的时间最多。我对此很好(因为使用mod 条件很容易控制)并感谢您的帮助!
  • @Dominic patrik 的建议提供超过 2 倍的速度,如果你能让它工作的话。请记住,如果这样做,请使用 zeros 预先分配包含所有绘图数据的数组 - 否则性能会差得多。
  • 我确实设法一次绘制所有行 - 分配 NaN 确实有效。对于我的具体问题,很难事先知道行数及其最大长度。尽管如此,你的回答还是最接近我的问题的答案——尽管它们可能是解决我问题的更好方法。
猜你喜欢
  • 2018-01-23
  • 2020-12-24
  • 1970-01-01
  • 2017-01-30
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2013-07-21
相关资源
最近更新 更多