5

我正在处理结构化网格。我只想在图中添加一个类型为 (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')
4

3 回答 3

3

伙计们,我找到了解决方案。hittest如果你设置为快 100 倍'off'!!!!!!!我这样做了:

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

我的生活改变了。

谢谢。一个。

于 2014-02-04T17:22:03.473 回答
2

问题是text显示太多了。我建议的方法是利用图形和轴回调(或未记录的侦听器)在达到某个缩放级别时添加text(或annotations),并根据缩放和平移保持显示哪些文本标签。简而言之,回调将检查轴的xlimylim属性并为该范围添加适当的文本(并删除任何旧文本)。

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

于 2013-10-05T00:40:59.540 回答
0

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

对我来说,最热门的方法没有任何性能优势 - 尽管在我的情况下没有任何缩放/剪辑问题,所以也许这解释了与其他人体验的差异。

于 2015-12-16T15:38:46.530 回答