2013-10-04 10 views
5

Ich habe es mit einem strukturierten Raster zu tun. Ich möchte nur einen Text vom Typ (m, n) hinzufügen, der die Indizes jedes Knotens anzeigt. Und vielleicht in der Zukunft stattdessen der Wert der Variablen. Ich benutze die Textfunktion. Ich profilierte den Code und die meiste Zeit ist in dieser Funktion verbracht. Es ist nur ein 101 * 101 Gitter, wenn Sie es erhöhen, ist der Code im Grunde stecken. Ich habe es bereits optimiert Schleifen für Text und Spritnf zu vermeiden, aber es immer noch zu langsam. Sobald das Plot erstellt wurde, ist es sehr fest und es dauert jedes Mal ein paar Sekunden, um zu schwenken oder zu zoomen. Siehe unten ein minimales Beispiel. Ich habe auch den Patch hinzugefügt, den ich verwende, um das Gitter anzuzeigen. (Ich benutze einen Patch, weil ich einige Grid-Mengen für jede Zelle grafisch darstellen möchte, und ich möchte es allgemein halten, falls ich zu einem unstrukturierten Mesh mit unregelmäßigen Polygonen übergehe. Patch ist superschnell, aber kein Problem damit). Irgendwelche Vorschläge, um dies zu beschleunigen? Dank"Text" -Funktion sehr langsam, Flaschenhals meines Codes

%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

Nur eine Idee, eine andere Funktion, die Text schreiben bietet, ist Annotation. Obwohl diese Füllung die Beschriftung schwerer macht, können Sie überprüfen, ob sie besser funktioniert. Aber ich würde nicht sehr viel zählen, dass es einen besseren Ansatz als 'text' gibt, es ist die Matlab-eingebaute Lösung dafür. – Werner

+0

Schau mal hier: http://stackoverflow.com/questions/4940561/does-matlab-execute-a-callback-when-a-plot-is-zoomed-resized-redrawn Übrigens, deine Bearbeitung zu meinem Antwort auf Ihre andere Frage war übereifrig, so Rezensenten dankenswerterweise abgelehnt. Versuchen Sie nicht, den Inhalt von Posts grundlegend zu ändern ... nur kleine Änderungen, wenn überhaupt. Lassen Sie mich wissen, ob es eine Nummer oder etwas Spezifisches zum Hinzufügen gibt und ich werde die Änderung vornehmen. Vielen Dank. – chappjc

+0

Mmm Ich überprüfte die Hilfe Anmerkung erlaubt es Ihnen nicht, einen Vektor zu verwenden, müssen Sie richtig radeln? Ich bezweifle, dass es schneller ist – Lupocci

Antwort

3

Jungs Ich fand die Lösungen. 100 mal schneller, wenn Sie nur hittest auf 'off' setzen !!!!! Ich tat dies:

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

und mein Leben verändert.

Danke. A.

+1

Danke, @ Alberto. Es funktioniert auch für mich –

+0

Super, arbeitete sofort! – pepgma

2

Das Problem ist, dass text einfach zu viel anzeigt. Der Ansatz, den ich vorschlage, ist die Verwendung von Bild- und Achsen-Callbacks (oder undocumented listeners), um die text (oder annotation s) hinzuzufügen, wenn Sie eine bestimmte Zoomstufe erreichen und die Textbeschriftungen je nach Zoom und Schwenk beibehalten. Kurz gesagt, die Rückrufe würden die Eigenschaften xlim und ylim der Achse überprüfen und den entsprechenden Text für diesen Bereich hinzufügen (und alten Text löschen).

Wenn dies wie eine Lösung erscheint, mit der Sie zufrieden wären, versuchen Sie es. Ich kann Ihnen später einige Hinweise und/oder Beispiele geben. Danke an Werner für den Tipp über Zuhörer.

+0

Danke, es sieht nach dem guten Weg aus. Seltsam, obwohl ich viele Programme sehe, die numerische Ergebnisse visualisieren, die Zehntausende von Texten behandeln, die den Knotenwert der Variablen in der gleichen Region ohne Probleme anzeigen.Es sieht so aus, als wäre Text nur eine einfache langsame Funktion. Ich kann das nicht glauben. – Lupocci

+1

@Alberto Neben dem dokumentierten Weg, den chappjc in einem Kommentar zu eurem Fragebeitrag gibt, um Zoomen und Schwenken zu hören, gibt es eine weitere undokumentierte Möglichkeit, 'xlim' und' ylim' zu hören (was ich bevorzuge, weil Sie viele Listener einstellen können) ohne sich um deine Funktionsgriffe kümmern zu müssen) kann [hier] gesehen werden (http://undocumentedmatlab.com/blog/setting-axes-tick-labels-format/). Übrigens ändert sich diese Syntax bei Verwendung von HG2 wie folgt: 'listener = addlistener (curAxes, 'XLim', 'PostSet', functionHandle);' – Werner

+1

Ja. +1 für Yair. Es lohnt sich wirklich, auf seine Mailingliste zu kommen. – chappjc

0

Ich hatte ein ähnliches Problem. Ich fand, dass die Reduzierung der Anzahl der Aufrufe von Text (in meinem Fall von ~ 500 auf 1) durch die Bereitstellung von Vektoren anstelle von vielen einzelnen Anrufen zu einem signifikanten Leistungsvorteil führte. In meinem speziellen Fall ging ich von ~ 25s zu 1 Grafik auf ~ 2s.

Für mich hatte die Hittest-Off-Methode keinen Leistungsvorteil - aber in meinem Fall gibt es keine Bedenken bezüglich Zooming/Clipping, das erklärt vielleicht den Unterschied zu den Erfahrungen anderer Leute.