2013-10-04 30 views
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') 
+0

只是一個想法,提供文字寫作的另一個功能是註釋。雖然它留下這個填充的註釋更重,但可以檢查它是否更好。但我不會認爲有比'text'更好的方法,它是matlab內置的解決方案。 – Werner

+0

看看這裏:http://stackoverflow.com/questions/4940561/does-matlab-execute-a-callback-when-a-plot-is-zoomed-resized-redrawn 順便說一下,你的編輯我的對你的另一個問題的回答是過分熱心的,因此評論者感謝地拒絕了它。儘量不要從根本上改變帖子的內容......只需稍作修改即可。讓我知道是否有數字或特定的東西添加,我會做出改變。謝謝。 – chappjc

+0

嗯,我檢查了幫助註釋不允許你使用一個載體,你必須循環正確嗎?我懷疑它的更快 – Lupocci

回答

3

夥計們,我找到了解決方案。如果你只設置hittest'off' !!!!!我這樣做:

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

和我的生活發生了變化。

謝謝。 A.

+1

謝謝,@Alberto。它也適用於我 –

+0

真棒,馬上工作! – pepgma

2

問題是,text只是顯示太多。我建議的方法是利用圖形和座標軸回調(或undocumented listeners)在達到某個縮放級別時添加text(或annotation),並根據縮放和平移來確定顯示哪些文本標籤。簡而言之,回調會檢查軸的xlimylim屬性,併爲該範圍添加適當的文本(並刪除任何舊文本)。

如果這看起來像一個解決方案,你會很高興,給它一個鏡頭。我可以稍後給你一些提示和/或示例。感謝Werner提供有關使用聽衆的提示。

+0

感謝它看起來像一個好方法。奇怪的是,雖然我看到許多程序可以通過數字化結果來處理成千上萬的文本,這些文本在相同的區域顯示變量的節點值,完全沒有任何問題。它看起來像文本只是一個普通的慢速功能。我不相信這一點。 – Lupocci

+1

@Alberto除了記錄的方式,由chappjc在您的問題文章的評論中提供,用於監聽縮放和平移,另一種未經證明的方式來監聽xlim和ylim變化(我更喜歡這種方式,因爲您可以設置很多監聽器而不必關心你的函數句柄)可以看到[這裏](http://undocumentedmatlab.com/blog/setting-axes-tick-labels-format/)。順便說一句,這個語法在使用HG2來更改:'listener = addlistener(curAxes,'XLim','PostSet',functionHandle);' – Werner

+1

是的。 Yair +1。他的郵件列表真的很值得。 – chappjc

0

我有類似的問題。我發現通過向文本提供向量而不是多次單獨調用來減少對文本的調用次數(在我的情況下,從大約500次減少到1次),從而帶來顯着的性能優勢。在我的具體情況下,我從〜25s開始顯示1圖到〜2s。

對我來說,最低命中率的方法沒有任何性能上的好處 - 儘管在我的情況下沒有任何縮放/裁剪問題,所以也許這解釋了與其他人的經驗不同。