Lineare Interpolation nicht existierender Werte
Eine Records einer Tabelle enthalten die Wertepaare (X,Y), aber nicht das Wertepaar (XP,YP). Was ist der einfachste Weg, um bei Vorgabe von XP einen zusätzlichen Record zu erzeugen, der das Wertepaar (XP,YP) enthält, wobei der Wert von YP sich aus den beiden beiden ersten Wertepaare (X1,Y1) und (X2,Y2) der nach abs(XP-X) aufwärts sortierten Liste von Records, entsprechend der Formel YP=Y1+((Y2-Y1)/(X2-X1))*(XP-X1) ergibt.
3 Antworten
-
Hallo FRue,
ich weiß nicht ob es funktionieren wird. Rein theoretisch sollte die Formel so aussehen:
---
let my := XP;
let X1 := first((select Tabelle) order by abs(my-X)).X;
let Y1 := first((select Tabelle) order by abs(my-X)).Y;
let X2 := first((select Tabelle where X != X1) order by abs(my-X)).X;
let Y2 := first((select Tabelle where X != X1) order by abs(my-X)).Y;
let new := (create Tabelle);
new.(X := my);
new.(Y := Y1 + (Y2 - Y1) / (X2 - X1) * (my - X1))
---
Dabei ist XP-> ein Datenfeld und "Tabelle" -> deine Tabelle.
Leo
-
Danke Leonid,
Die für eine effektive Programmierung wohl nicht ganz unwichtige Klausel "order by", wird im Handbuch auf insgesam 4 Zeilen erwähnt.
Das Konstrukt new.(x:= ...), kommt im Handbuch nirgendwo vor.
Für mich als Anfänger in Ninox (aber durchaus Erfahrener in ORACLE-SQL) ist das Handbuch im Teil Funktions und Sprachreferenz ziemlich unbrauchbar. Beim Ausprobieren fallen mir ständig die nirgendwo erwähnten automatischen Ersetzungen fehlender (void) Werte bei Aggregationen (z.B. void(Zahl) -> 0, void(String)-> " ", void(Datum)->? , etc.), sowie eine fehlende Angabe zu Typ der Eingangs und Ausgangswerte der Funktionen vor die Füße. Das mag alles ganz sinnvoll sein, ist aber nicht unbedingt eine Hilfe bei der Fehlersuche in Funktionen.
Ich bin mir deshalb nicht sicher, ob auch die Version, die nur einmal alle Records aufruft, auch funktioniert.
(Ich gehe davon aus, dass p := ((select Tabelle) order by abs(my-X)) ein Array von Pointern auf Records enthält.)
let my := XP;
let p := ((select Tabelle) order by abs(my-X))
let X1 := item(p,0).X;
let Y1 := item(p,0).Y;
let X2 := item(p,1).X;
let Y2 := item(p,1).Y;
let new := (create Tabelle);
new.(X := my);
new.(Y := Y1 + (Y2 - Y1) / (X2 - X1) * (my - X1))Falk
-
Hallo Falk,
ja, das würde auch gehen. Ist sogar viel einfacher.
Das Handbuch ist tatsächlich noch nicht optimal. Was dir bestimmt helfen wird, ist eine Referenzdatenbank von Copytexter. Die Datenbank liegt in der Cloud Team Webinar DE 2019. Die Datenbank heißt 0001_Ninox-Referez. Wenn du kein Team-Mitglied bist, einfach eine Email an support@ninoxdb.de schreiben.
Leo
Content aside
- vor 5 JahrenZuletzt aktiv
- 3Antworten
- 1360Ansichten