LabVIEWForum.de - Wert an naheliegensten Wert aus Array anpassen

LabVIEWForum.de

Normale Version: Wert an naheliegensten Wert aus Array anpassen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,

ich glaube es liegt am Wetter, aber mir fallen nur unsagbar blöde Algoryhtmen ein. Hier die Problemstellung:

Ich habe ein double-Array mit erlaubten Werten, zum Beispiel {0,5;1;2;4} und einen double-Eingang der einen beliebigen Wert annehmen darf. Nun möchte ich aus dem Array den Wert ermitteln, dessen Differenz zum Einganswert am kleinsten ist.

Anbei ein kleiner VI-Abschnitt zur Verdeutlichung! Vielleicht habt ihr effizientere Ideen als ich!

[attachment=56337]

Für Ideen und Anregungen bin ich dankbar.
Hallo TSC,

1. Differenz aus neuem Wert und deinem Array bilden
2. ArrayMinMax auf diese Differenz anwenden: Min-Index lesen
3. Mit dem Min-Index das Element aus deinem Array indizieren…

Ist schon recht feucht-warm heute… Big Grin
Danke für den Ansatz, hier die Umsetzung deiner Idee (wenn ich dich richtig verstanden habe Cool)

[attachment=56338]

Aber erstens: holt mir das nicht den nächst höheren bei einem genau mittig liegendem Wert
und zweitens frage ich mich, ob es nicht effizienter geht, als alle Differenzen zu bilden und so weiter?
Hallo TSC,

Zitat:erstens: holt mir das nicht den nächst höheren bei einem genau mittig liegendem Wert
Es gibt genau definierte Rundungsregeln in der IEEE754-Spezifikation, die die Grundlage für alle FloatingPoint-Operationen bildet…

Zitat:zweitens frage ich mich, ob es nicht effizienter geht, als alle Differenzen zu bilden und so weiter?
Du willst wissen, welcher Wert am nächsten zu deinem Input liegt - ohne den Abstand zu berechnen???

Solange dein Array sortiert vorliegt, kannst du natürlich auch im Array suchen: Threshold1DArray ist die gesuchte Funktion…
Zitat:Es gibt genau definierte Rundungsregeln in der IEEE754-Spezifikation, die die Grundlage für alle FloatingPoint-Operationen bildet…

Ja, und da seht doch hoffentlich drin, dass man eben bei 1,5 auf 2 aufrundet (also der nächst höhere Wert)?

Zitat:Du willst wissen, welcher Wert am nächsten zu deinem Input liegt - ohne den Abstand zu berechnen???
Solange dein Array sortiert vorliegt, kannst du natürlich auch im Array suchen: Threshold1DArray ist die gesuchte Funktion…

Haha, ja so könnte man es formullieren. Das Array liegt sortiert vor. Hier ein Versuch der Umsetzung:

[attachment=56341]

Soweit so gut. Schaut schön aus. Aber auch hier ein Rundungsproblem: habe ich im Array die Werte 2 und 4 und mein Input ist 3. Dann bekomme ich die 2 zurück. Sad
Hallo TSC,

Zitat:da seht doch hoffentlich drin, dass man eben bei 1,5 auf 2 aufrundet
Ja.

Zitat:(also der nächst höhere Wert)?
Falsch: der nächstliegende gerade Wert. ("bankers rounding")
Einfach mal Wikipedia lesen

Zitat:hier ein Rundungsproblem: habe ich im Array die Werte 2 und 4 und mein Input ist 3. Dann bekomme ich die 2 zurück.
Welcher gerade Wert liegt deiner "3" wohl näher: 2 oder 4?
Was erwartest du hier eigentlich für ein Ergebnis, wenn die Aufgabe lautet: "Finde den nächstliegenden Wert?"

Lösung: Threshold liefert dir einen "gebrochenen Index" zurück. Den kann man prima abrunden…
Ja danke, das hat geholfen,.. viel Input, guter Artikel. Kurz: es gibt keine Funktion die nach Norm falsch, aber dafür meinen Wünschen entsprechend, rundet!? Grml! Nagut, dann runde ich händisch!
Wenn deine Werte sortiert sind, dann könntest du auch diese Funktion zum Suchen verwenden:
https://zone.ni.com/reference/en-XX/help..._1d_array/
Gruß, Jens
(22.07.2016 14:47 )TSC schrieb: [ -> ]Kurz: es gibt keine Funktion die nach Norm falsch, aber dafür meinen Wünschen entsprechend, rundet!?
Um die Frage zu beantorten, müßte man erst mal wissen, was Dein Wünsche sind. Bisher hst Du nur verraten, dass Du 1.5 auf 2 und 2.5 gern auf drei gerundet haben möchtest. Darf man daruf schließen, dass Du immer aufgerundet haben möchtest?
Dann könnte ein kleines SubVI, welches das macht, z.B so aussehen (aber vielleicht geht es auch einfacher):
[attachment=56345]
[attachment=56348]
(22.07.2016 21:10 )jg schrieb: [ -> ]Wenn deine Werte sortiert sind, dann könntest du auch diese Funktion zum Suchen verwenden:
https://zone.ni.com/reference/en-XX/help..._1d_array/
Gruß, Jens

Hi Jens, das hatte GerdW auch schon vorgeschlagen und ist im letzten Anhang von mir verwendet. Bisher die angenehmste Lösung mit dem einzigen Problem: ich möchte nicht so runden, wie es laut IEEE korrekt wäre, sondern explizit aufrunden, wenn ich exakt zwischen zwei werten liege.


(24.07.2016 15:21 )Lucki schrieb: [ -> ]Um die Frage zu beantorten, müßte man erst mal wissen, was Dein Wünsche sind. Bisher hst Du nur verraten, dass Du 1.5 auf 2 und 2.5 gern auf drei gerundet haben möchtest. Darf man daruf schließen, dass Du immer aufgerundet haben möchtest?
Dann könnte ein kleines SubVI, welches das macht, z.B so aussehen (aber vielleicht geht es auch einfacher):

Moin Lucki,

Naja ich hatte gehofft das getan zu haben (Post 1)?! zugegeben, ich habe meine Wünsche zum problematischsten Teil im Anhang versteckt (aufrunden wenn ich exakt zwischen zwei werten liege).

Aber hier nochmal konkret:
Ich möchte aus einem sortierten Array den Wert ermitteln, welcher einem Suchelement am nächsten ist. Sollte das Array zwei Werte mit gleichem Abstand enthalten, möchte ich IMMER den größeren Wert erhalten.

VG,
Torsten
Seiten: 1 2
Referenz-URLs