LabVIEWForum.de
Werte ausserhalb eines Grenzwertes in Array setzen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Grafik & Sound (/Forum-Grafik-Sound)
+---- Thema: Werte ausserhalb eines Grenzwertes in Array setzen (/Thread-Werte-ausserhalb-eines-Grenzwertes-in-Array-setzen)



Werte ausserhalb eines Grenzwertes in Array setzen - jenitsche - 21.03.2012 14:26

Hallo zusammen,
ich arbeite gerade an einem VI zur Auswertung von Messbildern, dabei möchte ich in den Bildern, die als 2D-Array vorliegen, Werte die ausserhalb eines Grenzwertes liegen als NaN kennzeichnen. Das wäre natürlich über zwei for-Schleifen möglich in denen ich jeden einzelnen Pixel-Wert mit den Grenzwerten vergleiche, finde ich aber nicht so übersichtlich. Die Funktion Wertebereich Prüfen und Erzwingen setzt Werte ausserhalb des Grenzwertes auf den Wert des Grenzwertes. Gibt es sonst eine elegante Möglichkeit die Werte zu setzen?
Gruss
Jan


RE: Werte ausserhalb eines Grenzwertes in Array setzen - Lucki - 22.03.2012 10:37

Der Farb-/Grauwerte eines Bildes sind doch immer Integer-Werte, und bei denen gibt es kein "NaN". Hast Du das bedacht?
Ansonsten fällt mir nur ein, mit der sehr schnellen Funktion "Array umformen" das Array vorübergehend in ein 1D-Array zu verwandeln. Es könnte sein, dass das dann schneller geht - sicher bin ich mir da aber nicht. Aber man könnte es mal probieren.
[attachment=39186]


RE: Werte ausserhalb eines Grenzwertes in Array setzen - jenitsche - 22.03.2012 14:02

Ja, dass die original Grauwerte Integer-Werte sind und es da kein NaN gibt habe ich bedacht, es geht auch eher um Werte mit denen schon einige Berechnungen durchgeführt wurden und die daher dann als DBL vorliegen. Ist es denn schneller eine Schleife mit N*M Durchläufen zu erstellen als zwei Schleifen mit N und M? Das müsste meiner Meinung nach der gleiche Rechenaufwand sein.


RE: Werte ausserhalb eines Grenzwertes in Array setzen - jenitsche - 26.03.2012 09:46

OK, ich habe jetzt noch eine Möglichkeit gefunden das ganze mit der Wertebereich prüfen und erzwingen Funktion zu lösen. Allerdings werden die Werte dann als Inf und nicht als NaN maskiert. Alternativ geht es vergleichbar auch mit den einfachen Vergleichsfunktionen. Habe alle drei Versionen mal angehängt. Bei einer Laufzeitprüfung scheint allerdings die doppelte For-Schleife am besten abzuschneiden, daher werde ich sie weiter verwenden.


RE: Werte ausserhalb eines Grenzwertes in Array setzen - GerdW - 26.03.2012 09:51

Hallo jenitsche,

ja, Division durch Null ergibt immer noch Inf...

Zitat:Bei einer Laufzeitprüfung scheint allerdings die doppelte For-Schleife am besten abzuschneiden, daher werde ich sie weiter verwenden.
Kaum zu glauben. Kannst du mal das VI anhängen? Wie hast du die Zeit gemessen?

Noch'ne Idee:
[attachment=39231]


RE: Werte ausserhalb eines Grenzwertes in Array setzen - jenitsche - 26.03.2012 10:39

Im prinzip ist es mir egal ob da Inf oder NaN steht, solange die Werte eindeutig von den restlichen zu unterscheiden sind.
Interessante Beobachtung: Wenn ich die Laufzeit aller Lösungen in einem gemeinsamen VI ermittle (siehe Anhang ArrayErsetzenLaufzeit.vi) ist die Version mit der Wertebereich-Funktion am schnellsten, die Doppelschleife am langsamsten. Wenn ich jede Lösung in einem einzelnen VI laufen lasse (siehe restlichen 4 VI im Anhang) sind die Schleifen schneller. Hat jemand eine Erklärung dafür?


RE: Werte ausserhalb eines Grenzwertes in Array setzen - GerdW - 26.03.2012 10:52

Hallo jenitsche,

wenn du Zeiten messen willst, solltest du:
- nichts parallel abarbeiten lassen (wg. ganz allgemein korrekter Messung)
- irgendwelche Sachen, die potentiell in µs abgearbeitet sind, mehrfach in einer Schleife ausführen lassen (z.B. 1k oder 1M mal) und dann wieder auf eine Iteration zurückrechnen (wg. Messgenauigkeit)
[attachment=39240]
Wie man Zeiten korrekt misst, wird sowohl in Core1 erläutert als auch in diversen Forenbeiträgen...


RE: Werte ausserhalb eines Grenzwertes in Array setzen - jenitsche - 26.03.2012 12:54

Danke Gerd für den Hinweis. Bei 1000 Durchläufen sind dann die Schleifen mit 20 bzw. 30 ms. doch einiges langsamer als die Vergleichs- oder Wertebereichsfunktionen die im µs-Bereich liegen.