【问题标题】:Matlab plot in loop error循环错误中的Matlab绘图
【发布时间】:2014-04-21 08:05:16
【问题描述】:

我在 for 循环中创建图形。该图是一个二维网格图,应该在每次迭代时更新。要在 200x200 数组中绘制的值。

我的问题是:似乎每次迭代都在运行计算,但绘图始终是第一个创建的,无论我只是绘图还是保存到文件。

这是我的代码:

x = 1:200;
y = x;

for i = 1:100000

   c = calculate(stuff, c); % value to be created, nothing to do with x and y

   h = figure;
   mesh(x,y,c);
   saveas(h, sprintf('FIG%d.jpg',i);
   drawnow;    % did not work with or without this command
   close(h);

end

首先,感谢您的所有意见和建议!没想到这么短的时间就得到了这么多的帮助!

那么,我可以在这里回答一些困惑。

致 Daniel:是的,c 正在改变。该程序正在根据其先前的值计算 c。并且有足够的步长让 c 改变。

致 R.Schifini:我尝试过 pause(.1),但不幸的是没有帮助

致安德鲁:感谢您的指点。现在附上完整的程序。而对于 Daniel,程序根据之前的值计算 c 的值。

致鸭子:我尝试了 clf(h, 'reset') 但不幸的是它没有帮助。

完整代码:

主程序:有兴趣的可以参考维基百科的物理方程

http://en.wikipedia.org/wiki/Cahn%E2%80%93Hilliard_equation

% Program to calculate composition evolution for nucleation and growth
% by solving Cahn-Hilliard equation - Time dependent non-linear
% differential equation



% Parameter
sig = 0.1; % J/m^2
delta = 10E-9; % m
D = 1E-9; %m^2/s
A = 10*sig/delta;    % J/m
K = 3*sig*delta;   % J/m^3
M = D/(2*A);   % m^2/s
N = 200;    % mesh size
dt = 1E-12; %s
h = delta/10;

% Rng control
r = -1+2.*rand(N);
beta = 1E-3;
n = 10000;

% initialization
c0 = zeros(200);
c0 = c0+ 0.1+beta.*r;
c = c0;

x = h.*linspace(-N/2,N/2,N);
y=x;


% Iteration
for i = 1:n
    LP_c = laplacian(c,h);
    d_f = A*(4*(c.^3)-6*(c.^2)+2*c);
    sub = d_f - (2*K)*LP_c;
    LP_RHS = laplacian(sub,h);
    RHS = M*LP_RHS;

    c = c + dt.*RHS;

    % Save image every 2000 steps
 %  if ( i==1000 || i==10000 || i==100000)

   %       h = mesh(x,y,c);
   %       pause(.1);
   %       saveas(h, sprintf('FIG%d.jpg',i));
   %       clf(h,'reset');

   % end

end

%h = figure;
mesh(x,y,c);

拉普拉斯函数:

function LP_c = laplacian(c,h)

v1 = circshift(c,[0 -1]);
v2 = circshift(c,[0 1]);
v3 = circshift(c,[-1 0]);
v4 = circshift(c,[1 0]);

LP_c = (v1+v2+v3+v4-4.*c)./(h^2);

end

结果:

您可以看到主程序中的注释部分用于定期绘图。它们都为每次迭代提供相同的图。我尝试了当前的 OR 版本,还尝试了 if ( mod(i,2000) == 0) 来绘制更多图片。没有区别。显示:

但是,如果我注释掉周期性绘图,只需针对不同的 n 值运行程序,我就会得到不同的绘图,并且它们遵循物理定律(演化结构),按时间顺序显示

因此我排除了 c 可能不会自行更新的可能性。一定是对matlab绘图功能的一些误用。或者可能是一些内存问题?

我在编辑期间发现了一个有趣的点:如果我将命令 h = figure 放在循环前面并在循环结束后绘制,如下所示:

h = figure;
% Iteration
for i = 1:n
    LP_c = laplacian(c,h);
    d_f = A*(4*(c.^3)-6*(c.^2)+2*c);
    sub = d_f - (2*K)*LP_c;
    LP_RHS = laplacian(sub,h);
    RHS = M*LP_RHS;

    c = c + dt.*RHS;

end

mesh(x,y,c);

似乎循环期间计算的所有c值都会重叠并给出如下图:我想这表明了一些关于matlab绘图功能的事实,但我不确定

顺便说一句,我可以直接回答每条评论并在我的帖子中突出显示新添加的部分吗?抱歉,我对 Stack Overlow 的熟悉程度不如我应有的 :)

【问题讨论】:

  • 除了在saveas(h, sprintf('FIG%d.jpg',i); 处缺少),代码似乎完全没问题。我尝试使用c 的一些随机数据来重现您的问题,并获得了不同的图像。您确定 c 发生了变化,并且变化大到足以在图中可见吗?
  • 这可能会有所帮助:在保存之前放置一个pause(.1)。还可以尝试将h = figure 和close(h) 移到循环之外。无需在每个循环中打开和关闭图形。
  • 您能否将示例代码更改为可以自行运行以重现问题的代码?这将使 SO 成员更容易诊断,并可能帮助您自己调试。
  • @Daniel 在正确的轨道上听起来。另外,c = calculate(stuff, c) 将c 的先验值作为输入,而不依赖于i,这有点奇怪。这是故意的吗?
  • 您可能想使用:clf(h,'reset') 而不是 close(h),因为它会产生压力并且通常会加快速度。 @R.Schifini,我认为这里不需要 pause 来解决保存文件的固有延迟。

标签: matlab plot


【解决方案1】:

我运行了您的例程,并进行了以下更改,它适用于我:

% Iteration
for i = 1:n
    LP_c = laplacian(c,h);
    d_f = A*(4*(c.^3)-6*(c.^2)+2*c);
    sub = d_f - (2*K)*LP_c;
    LP_RHS = laplacian(sub,h);
    RHS = M*LP_RHS;

    c = c + dt.*RHS;

    % Save image every 2000 steps
    if ( mod(i,2000)==0)
        h1 = mesh(x,y,c);
        drawnow;
        saveas(h1, sprintf('FIG%d.jpg',i));
    end

end

主要变化是图形句柄变量从h 到h1。
为什么?您已经在方程式中使用了变量 h。

问候,

【讨论】:

  • 哦,我确实犯了一个愚蠢的错误!你是对的,它现在正在工作。一个附带问题:使用命令 h1 = mesh(),每次循环调用 h1 时,它会被指向一个新地址还是分配一个不同的值?它的行为像指针吗? - 谢谢!
  • h1 是图形句柄。每次调用它时都取不同的值。如果要保留该值,则必须在for..end 之前使用一次。在这种情况下,只需在循环中调用mesh(x,y,z)(不带h1=..),网格将覆盖当前图形(如果未保存:hold off)
  • 我更正了,根据Matlab:h1是Surfaceplot图形对象的句柄。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2012-04-26
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多