Drawnow和cla函数在我的matlab代码中占用了大部分时间

Drawnow和cla函数在我的matlab代码中占用了大部分时间,matlab,optimization,Matlab,Optimization,我正在处理一个结构化网格。我用patch来显示它,我只是尝试在绘图中添加一个类型(m,n)的文本,它指示每个节点的索引。我使用文本函数,将来我想绘制变量的节点值(它们是时变的,这就是文本函数在循环中的原因)。我分析了代码,大部分时间都花在drawnow、cla和text函数上: drawnow 7.882 s 51.7% text(x(:),y(:),charINPUT(:),'C... 4.348 s 28.5% c

我正在处理一个结构化网格。我用patch来显示它,我只是尝试在绘图中添加一个类型(m,n)的文本,它指示每个节点的索引。我使用文本函数,将来我想绘制变量的节点值(它们是时变的,这就是文本函数在循环中的原因)。我分析了代码,大部分时间都花在drawnow、cla和text函数上:

drawnow                              7.882 s    51.7%
text(x(:),y(:),charINPUT(:),'C...    4.348 s    28.5% 
cla                                  2.300 s    15.1%
我在这里打开了一个线程,以了解是否有可能提高文本函数的性能,或者是否有任何更快的替代方法可用。在这里我想弄明白为什么drawnow和cla这么慢。如果我删除cla,它会变得更慢:

drawnow                             42.774 s 86.2%  
text(x(:),y(:),charINPUT(:),'C...    4.638 s  9.3%
现在抽了很多。添加cla有帮助,但仍然很慢

这只是一个71 x 71的网格,如果你增加单元格的数量,代码基本上被卡住了。有没有加快速度的建议?(注意:我使用面片是因为我想为每个单元绘制一些网格数量,并且我想保持它的通用性,以防我移动到带有不规则多边形的非结构化网格,这些多边形在时间步长内移动,这就是为什么它在时间步长内。)

编辑:我最初认为修补程序非常快,因为它只花了几毫秒,但正如grantnz在下面的评论中所指出的,它实际上是在调用drawnow时绘制的。如果在我下面提供的代码中注释了hpatch3=…行,那么这就是分析器的计时:

    text(x(:),y(:),charINPUT(:),'C..      4.539 s   58.4%   
    cla                                   2.285 s   29.4% 
    drawnow                               0.576 s    7.4%
因此,现在事情变得有点艰难,但仍然相当缓慢。看起来创建和绘制补丁大约需要7秒,创建和绘制文本大约需要8秒。主要区别在于,对于文本,时间主要花在函数本身(以及cla)上而对于补丁来说,它是和drawnow一起使用的。你知道为什么会发生这种情况吗?有可能加快一点吗?这是我的代码

%define grid and grid numbering
ntimesteps = 10
DX = 10 ; %=DY
mmax = 71; %= number of nodes in x
nmax = mmax %= number of nodes in y
[ x y ] = meshgrid(0:DX:DX*(mmax-1),0:DX:DX*(mmax-1)); %grid
[ mMAT nMAT ] = meshgrid(1:mmax,1:nmax); %grid numbering

for j=1:ntimesteps    
   cla    
   %
   %display patch
   %
   cont = 0
   for m=2:mmax
       for n=2:nmax
           cont=cont+1;
           Xpatch(1:4,cont) = [ x(n-1,m-1) ; x(n-1,m) ; x(n,m) ; x(n,m-1) ] ;% ii+1 since it has the BC
           Ypatch(1:4,cont) = [ y(n-1,m-1) ; y(n-1,m) ; y(n,m) ; y(n,m-1) ] ;
           Zpatch(cont) = 1;
       end
   end
   hpatch3 = patch(Xpatch(:,:),Ypatch(:,:),Zpatch(:)');
   %
   % display node indices
   %
   charINPUT = regexp(sprintf('(%d,%d)\n',mMAT(:),nMAT(:)),'(?<=\s*)(\S*)(?=\n)','match'); % use regexp to vectorize sprintf and so avoid slow loops with sprintf
   text(x(:),y(:),charINPUT(:),'Clipping', 'on');
   set(gcf,'position',[9 40 1350 650])
   set(gcf,'PaperPositionMode','auto')
   %
   % other things  added to the plot
   %
    drawnow
end
%定义网格和网格编号
ntimesteps=10
DX=10;%=DY
mmax=71;%=x中的节点数
nmax=mmax%=y中的节点数
[xy]=网格网格(0:DX:DX*(mmax-1),0:DX:DX*(mmax-1));%grid
[mMAT nMAT]=网格网格(1:mmax,1:nmax);%网格编号
对于j=1:ntimesteps
cla
%
%显示补丁
%
cont=0
对于m=2:mmax
对于n=2:nmax
cont=cont+1;
Xpatch(1:4,cont)=[x(n-1,m-1);x(n-1,m);x(n,m);x(n,m-1)];%ii+1,因为它有BC
Ypatch(1:4,cont)=[y(n-1,m-1);y(n-1,m);y(n,m);y(n,m-1)];
Zpatch(cont)=1;
结束
结束
hpatch3=patch(Xpatch(:,:),Ypatch(:,:),Zpatch(:)');
%
%显示节点索引
%

charINPUT=regexp(sprintf('(%d,%d)\n',mMAT(:),nMAT(:),'(?例如,我可以通过将渲染器更改为
painters

set(gcf, 'renderer', 'painters')
根据文件

画师-MATLAB使用的原始渲染方法在 该图形仅包含简单或小的图形对象


根据您在现实生活中使用的修补程序的不同,您可能需要使用zbuffer或openGL渲染器。通过使用低级openGL调用来放置文本对象,您可能可以获得更好的性能,但这将是一项大量工作。

我怀疑修补程序“非常快”,因为当您可以ll patch。当您调用drawnow时会出现屏幕更新,因此无法立即看到补丁的实际成本。绘制的图不会向我传达任何信息。这只是一个显示速度问题的示例,还是它生成的输出对您有用?我建议您先获取代码以生成有用的输出,然后尝试加快速度。我正在努力了解一个至少有5041个标签的图形是如何被任何人读取的。这只是一个很小的例子。然而,这正是我试图做的,如果我减小文本的大小,我可以在22英寸的大屏幕上看到我所有的域以及我所有71*71节点中的变量值。这对调试我的fortran代码非常有用。但是正如你从上面的计时中看到的那样,它的速度非常慢。10个时间步需要15秒。无论如何,感谢你的明智建议,我没有想到补丁可以在drawnow中花费大部分时间。请查看我的更新帖子,评论补丁告诉我们补丁是用drawnow绘制的,但是文本实际上是在xt被称为。