【发布时间】: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来解决保存文件的固有延迟。