“文本”功能很慢,我的代码瓶颈

时间:2013-10-04 23:28:41

标签: matlab optimization

我正在处理结构化网格。我只想在图中添加一个类型(m,n)的文本,指示每个节点的索引。也许在未来变量的价值。我使用文本功能。我分析了代码,大部分时间花在了这个函数上。它只是一个101 * 101网格,如果你增加它,代码基本上卡住了。我已经优化了它,避免了文本和spritnf的循环,但它仍然太慢。此外,一旦创建了绘图,它就会非常卡住,每次平移或缩放都需要几秒钟。请参阅以下最小示例。我还添加了用于显示网格的补丁。 (我使用补丁,因为我想为每个单元格绘制一些网格数量,我想保持它一般,以防我移动到具有不规则多边形的非结构化网格。补丁是超快的,但没有问题)。有什么建议加快这个吗?感谢

    %define grid and grid numbering
    DX = 10 ; %=DY
    mmax = 101; %= 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
    %
    %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')

3 个答案:

答案 0 :(得分:3)

伙计们我找到了解决方案。只需将hittest设置为'off'即可快100倍!我这样做了:

text(x(:), y(:), charINPUT(:), 'Clipping', 'on','hittest', 'off');

我的生活发生了变化。

感谢。 甲

答案 1 :(得分:2)

问题是text只是显示太多。我建议的方法是利用图形和轴回调(或undocumented listeners)在达到某个缩放级别时添加text(或annotation s),并维护哪个文本根据缩放和平移显示标签。简而言之,回调将检查轴的xlimylim属性,并为该范围添加适当的文本(并删除任何旧文本)。

如果这似乎是一个你会满意的解决方案,请试一试。我稍后会给你一些提示和/或例子。感谢Werner关于使用听众的提示。

答案 2 :(得分:0)

我有类似的问题。我发现通过向它提供向量而不是许多单独的调用来减少对文本的调用次数(在我的情况下从~500到1),可以带来显着的性能优势。在我的具体情况下,我从〜25秒到显示1图表到~2s。

对我来说,最热门的方法没有任何性能上的好处 - 虽然在我的情况下没有任何缩放/剪裁问题,所以这可能解释了与其他人的体验的差异。