如何在Matlab循环中监视变量而不打印它?

4
我正在运行一个循环,在其中计算变量。能够看到这些变量的当前值将非常有用。打印它们并不实用,因为循环的其他部分正在打印大量文本。另外,在“工作区”选项卡上,这些值直到循环结束后才会显示出来。
是否有一种方法可以监视这些变量,例如通过将它们打印到一个窗口中?

2
循环需要很长时间吗?你是想用来排除故障还是只是想看一下?如果是排除故障,可以使用调试器。你想将它打印到除控制台以外的其他地方吗? - Stewie Griffin
是的,循环需要很长时间,我想这样做是为了进行故障排除。也许解决方案是将其打印到一个图形窗口中。 - Karlo
4
如果你的程序运行缓慢,想要加速它,你应该使用性能分析器profiler对代码进行分析。输入profile on开始记录,执行代码,输入profile off停止记录,然后输入profile viewer或类似命令查看结果。如果只是运行时间长,并不需要优化,那么请注意在循环中添加任何检查都会使其变得更慢。你也可以像这样添加一些东西:if(mod(ii, 1000)==0) disp('每1000次迭代显示某些内容'); end - Matthew Gunn
1个回答

6
你可以使用一个 text 对象创建一个图形,并根据所需变量更新其 'string' 属性。
h = text(.5, .5, ''); %// create text object
for n = 1:1000
    v = n^2; %// loop computations here. Variable `v` is to be displayed
    set(h, 'string', ['Value: ' num2str(v)]);
    drawnow %// you may need this for immediate updating
end

为了更快的速度,你可以每隔S个迭代更新一次:

h = text(.5, .5, ''); %// create text object
S = 10; %// update period
for n = 1:1000
    v = n^2; %// loop computations here. Variable `v` is to be displayed
    if ~mod(n,S) %// update only at iterations S, 2*S, 3*S, ...
        set(h, 'string', ['Value: ' num2str(v)]);
        drawnow %// you may need this for immediate updating
    end
end

或者使用drawnow('limitrate'),如@Edric所提到的:

h = text(.5, .5, ''); %// create text object
for n = 1:1000
    v = n^2; %// loop computations here. Variable `v` is to be displayed
    set(h, 'string', ['Value: ' num2str(v)]);
    drawnow('limitrate')
end

3
假设这是一个长循环,并且要查看的值每秒更新少于一次,那么这是一个好的解决方案。否则,循环会变得相当慢(我猜测)...? - Stewie Griffin
@StewieGriffin 是的,这肯定会减慢循环速度。如果 OP 只想每 S 次迭代检查变量,他们可以在 if 分支中使用 mod。我会更新。 - Luis Mendo
@StewieGriffin 哈哈哈。很好。 - Luis Mendo
2
drawnow('limitrate') 怎么样? - Edric
2
如果循环中的计算是限制因素而不是迭代次数,则将值放入“waitbar”的标题中也是一个不错的选择。 - craigim
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接