Auf dem Weg zur Numerik Version 3. Numerik ist auf dem Weg zum nächsten großen Release, v3 0 Ein erstes Vorschau-Alpha wurde bereits in die NuGet-Galerie geschoben, obwohl es noch viel zu tun gibt. Wenn du es gern besser verstehst Wo wir gerade sind, wo wir hinfahren, und warum, dann lesen Sie weiter. Warum ein neues Haupt-Release. Wir gelten die Prinzipien der semantischen Versionierung bedeutet, dass wir nicht sollen irgendwelche Teile der öffentlichen Oberfläche der Bibliothek zu brechen, die Ist fast alles in unserem Fall, bei kleineren Releases mit dem 3-teiligen Versionsformat. Damit ist sichergestellt, dass du problemlos in kleinere Releases ohne Zweitgedanken aufrüsten oder irgendwelche deines Codes brechen kannst. Trotzdem gibt es manchmal einen guten Grund, das Design zu ändern , Weil es Weg zu kompliziert zu verwenden, inkonsistent ist, führt zu schlechten Leistungen oder war einfach nicht sehr gut durchdacht oder wir haben einfach gelernt, wie man es in einer viel besseren Weise zu tun Sie vielleicht bemerkt haben, dass einige Mitglieder wurden als veraltet deklariert Die letzten paar kleinere Veröffentlichungen, mit Vorschlägen, wie es stattdessen zu tun, obwohl die alte Implementierung intakt gehalten wurde Im Laufe der Zeit all diese alten Code wurde ein Schmerz zu pflegen, und die Verwendung der Bibliothek war viel komplizierter als nötig Also habe ich beschlossen, es s Zeit, um endlich die meisten dieser Probleme zu beheben und aufzuräumen. Wir bewegen etwas Käse herum in dieser Version Ihr Code wird in ein paar Gelegenheiten brechen Aber in allen Fällen ein Fix sollte einfach sein, wenn nicht trivial Auch, einmal dort werden wir wieder gebunden werden Durch semantische Versionierung, um die Bibliothek stabil über alle zukünftigen kleineren Versionen zu halten und so wahrscheinlich für die kommenden Jahre Auch können wir die Bereitstellung von Patches für die alte v2 Niederlassung, wenn nötig für eine Weile Trotzdem empfehle ich dringend, auf v3 zu aktualisieren, sobald verfügbar. Feedback Ist willkommen. Eine erste Vorschau v3 0 0-alpha1 wurde bereits in NuGet veröffentlicht und ich plane, mindestens zwei weitere Vorschau-Versionen zu machen, bevor wir die erste Version von v3 0 erreichen. Bitte schau sie mal an und gibt Feedback - jetzt ist ein Einzigartige Möglichkeit für das Brechen von Änderungen. Überblick auf das, was bisher getan wurde. Namespace Vereinfachungen. Mehr funktionale Design, wo angemessen Stellen Sie sicher, dass alles gut funktioniert und fühlt sich native in beiden C und F. Use gemeinsame Kurznamen, wenn gut bekannt, anstatt sehr lange volle Namen Trigonometry. Linear Algebra Mit den generischen Typen ist die empfohlene Weise jetzt sicherstellen, dass es gut funktioniert Die IO-Klassen für Matrix-Vektor-Serialisierung werden separate Pakete Großes Refactoring der iterativen Solver Gefüllt einige fehlende Stücke, verschiedene Vereinfachungen, viele andere Änderungen. Distributions Major cleanup Direkte Belichtung von Verteilungsfunktionen pdf, cdf, etc. Parameter Schätzung. Neue Distanzfunktionen. Überblick auf das, was geplant ist zu tun. Iterative Solver brauchen mehr Arbeit Ich möchte auch sie so entwerfen, dass sie manuell, auf einfache Weise iteriert werden können. Integrierte Transformationen FFT etc benötigen große Refactoring Unterstützt von nativen Anbieter, wenn möglich. Beachten Sie, um Filter zurückzuholen FIR, IIR, gleitenden Durchschnitt, etc. Die aktuelle QR-Zerlegung-basierte Kurvenanpassung ist ineffizient für große Datensätze, aber die Festsetzung ist eigentlich nicht Sehr kompliziert. Investigate und fix eine Inkonsistenz in der Precision class. Drop redundante null-checks. Details auf was s neu in Version 3 so weit. Dropping Namespaces. Did Sie jemals haben, um 10 verschiedene Numerics Namespaces zu öffnen, um alles, was Sie brauchen Dies sollte In v3 etwas besser werden, da die statischen Fassaden wie Integrate Interpolate Fit oder FindRoots für einfache Fälle direkt in den Root-Namespace verschoben wurden und alle Algorithmen-Namespaces für fortgeschrittene Anwendungen des Formulars jetzt einfach sind. Zusätzlich zu den vereinfachten Namespaces, Last Differentiate overload, die den gesamten interpolierten Wert zurückgibt und die erste und zweite Ableitung an einem gewissen Punkt x anstelle von zwei Out-Parametern in einer unerwarteten Reihenfolge vereinfacht wurde, gibt sie nun ein Tupel mit einer vernünftigen Bestellung zurück. Das Design der doppel-exponentiellen Transformation war Eher seltsam Es wurde zu einer statischen Klasse vereinfacht und ist viel einfacher, explizit zu verwenden. Wahrscheinlichkeitsverteilungen. Obwohl es immer möglich war, eine benutzerdefinierte zufällige Quelle RNG einer Verteilung für zufällige Nummernabtastung zuzuordnen, war es etwas kompliziert und erforderte zwei Schritte Alle Verteilungs-Konstruktoren haben eine Überlastung, die eine benutzerdefinierte zufällige Quelle direkt bei der Konstruktion akzeptiert, in einem einzigen Schritt. Einige Verteilungen unterstützen nun die Maximum-Likelihood-Parameterschätzung und die meisten Distributionen implementieren eine inverse kumulative Verteilungsfunktion Verteilungsfunktionen wie PDF CDF und InvCDF werden nun direkt ausgesetzt Als statische Funktionen. Die Inline-Dokumentation und Parameter-Namensgebung wurde deutlich verbessert ChiSquare wurde ChiSquared und die IDistribution-Schnittstelle wurde IUnivariateDistribution Simpler mehr kompositorische Stichproben in F mit neuen Sample-Modul. New Distance-Funktionen. Standard Routinen für die Bewertung der Euklidischen, Manhattan und Chebychev Distanzen Zwischen Arrays oder Vektoren, auch für die gemeinsame Summe der absoluten Differenz SAD, Mean-Absolute Error MAE, Summe der quadratischen Differenz SSD und Mean-Squared Error MSE Metriken Hamming Distanz Leveraging Provider wo angemessen. Less Null Checks und ArgumentNullExceptions. Wahrscheinlich als Seite Effekt aus meiner Exposition gegenüber funktionalen Programmierung im letzten Jahr, ich nicht mehr folgen die Argumente, warum in C jede Routine muss explizit überprüfen alle Argumente für null Ich habe bereits ein paar dieser Schecks fallen gelassen, aber es gibt noch mehr als 2000 Plätze, wo Numerik Wirft ein ArgumentNullException Die meisten von ihnen werden wahrscheinlich weg sein Es gibt einen Fall, wo es sinnvoll ist, sie zu behalten, obwohl wenn eine Routine ein Argument akzeptiert, aber es nicht sofort verwendet und daher keine sofortige NullReferenceException verursacht, eine Nullreferenz, die sich schleicht Sei schwer zu debuggen, also werden wir den Scheck behalten Aber solche Fälle sind wegen der Natur der Bibliothek sehr selten. Die IO-Bibliothek, die früher als Teil des Kernpakets verteilt wurde, ist nun ein Satz von separaten NuGet-Paketen, zB und Leben In einem separaten Repository. Favoring generischen linearen Algebra-Typen. Seit der generische Namespace war die ganze Zeit sowieso erforderlich und die empfohlene glückliche Weg ist jetzt immer die generischen Typen verwenden, alles aus dem Namespace wurde verschoben ein Namespace up Von nun an Sie in der Regel Müssen nur bei der Arbeit mit der linearen Algebra zwei Namespaces öffnen, auch wenn Faktorisierungen benötigt werden. Zum Beispiel bei der Verwendung des Doppel-Typs, öffnest du d. Und da das Tippen in F stärker ist, werden alle init-Funktionen im F-Modul direkt zurückgegeben Generische Typen, so dass Sie don t haben, um manuell die ganze Zeit Die meisten Routinen wurden verallgemeinert, um auf generische Typen zu arbeiten. Für Fälle, wo Sie wollen, um generische Algorithmen implementieren, sondern müssen auch neue dichte oder spärliche Matrizen oder Vektoren ein neuer Generic Builder zu schaffen Wurde hinzugefügt. Dies sollte nur selten im Benutzercode erforderlich sein. Missing Skalar-Matrix-Routinen. Ein paar fehlende Skalar-Matrix-Routinen wie das Hinzufügen oder Subtrahieren eines Skalars zu einer Matrix oder das Teilen eines Skalars durch eine Matrix wurden hinzugefügt, von den Anbietern, wo möglich, unterstützt Es gibt jetzt auch eine Modulroutine. Point-weise Infix-Operatoren wo unterstützt F. We ve hat Punkt-weise und Operatoren zu Matrizen und Vektoren in der Kernbibliothek hinzugefügt Dies wird in allen Sprachen noch nicht unterstützt, aber funktioniert gut in F, obwohl ohne Currying-Support Natürlich können Sie in den anderen Sprachen auch weiterhin die üblichen Methoden wie bisher nutzen. Faktorisierung und Iterative Solver. Previously Matrix-Faktorisierung war nur durch Erweiterungsmethoden oder explizite Schaffung zugänglich, die bei der Verwendung von generischen Typen nicht sehr gut funktionierte. Die generische Matrix Typ bietet nun Methoden, um sie direkt zu erstellen. Als solche wurden die tatsächlichen Implementierungen verinnerlicht, da es keinen direkten Zugriff mehr gibt. Die QR-Faktorisierung ist nun standardmäßig dünn und Factorys klingen ihre Ergebnisse nicht mehr ohne praktischen Grund Iterative Solver-Design wurde deutlich vereinfacht und ist jetzt generisch und beliebt, wo möglich und akzeptiert generische Typen überall Die Namespaces sind jetzt viel flacher als die sehr detaillierte Struktur fügte keinen Wert hinzu, aber bedeutete, dass Sie ein Dutzend Namespaces öffnen mussten. Misc lineare Algebra Verbesserungen. Vectoren haben jetzt eine ConjugateDotProduct-Routine zusätzlich zu DotProduct. Vectors jetzt explizit bieten richtige L1, L2 und Unendlichkeit Normen. Matrices Vektoren haben jetzt konsistente Enumeratoren, mit einer Variante, die Nullen nützlich, wenn sparse. Matrix Vector Erstellungsroutinen wurden vereinfacht und In der Regel nicht mehr explizite Dimensionen erfordern Neue Varianten, um diagonale Matrizen zu erstellen, oder solche, bei denen alle Felder denselben Wert haben. Matrices Vektoren stellen fest, ob der Speicher mit einer neuen IsDense-Eigenschaft dicht ist. Provider wurden in einen Provider-Namespace verschoben und sind wieder vollständig generisch. Robuster komplexe Asin Acos für große reale Zahlen. Trig Funktionen gemeinsame Kurznamen anstelle von sehr langen namesplex gemeinsamen Kurznamen für Exp, Ln, Log10, Log. Statistics neue Single-Pass MeanVariance-Methode, wie oft zusammen verwendet. Share this post. I m Immer noch daran arbeiten, das F-Ding zu kauen, um herauszufinden, wie man in F liebt, anstatt nur aus anderen Sprachen zu übersetzen, die ich kenne. Ich habe vor kurzem über die Fälle nachgedacht, in denen du keine 1 1 Karte zwischen vor und nach den Fällen hast Fällt unten. Ein Beispiel dafür ist gleitende Durchschnitte, wo in der Regel haben Sie len-n 1 Ergebnisse für eine Liste der Länge len bei der Mittelung über n items. For die Gurus da draußen, ist dies ein guter Weg, um es mit Warteschlange gequetscht Von Jomo Fisher. Vielleicht wäre ein besserer Weg, um eine MovingAverageQueue durch die Vererbung von Fifo. asked Nov 17 08 um 11 12 zu implementieren. Ich musste es als Let MovingAverage ns seq Float deklarieren, um dies in ein Utility-Modul, weg von der Call-Site, Um das Typ-System zu beschwichtigen Soweit ich sagen kann, funktioniert das nur mit Schwimmern, aufgrund einer Beschränkung von MSDN-Ansprüchen kann ich das ersetzen, um das auf einer int-Sequenz zu verwenden, aber das gibt einen anderen Fehler Brian, kannst du das neu formulieren Antwort auf die Arbeit in generischen Kontexten, so dass es mit Seq-of-any-Arithmetik-Typ arbeiten, ohne Typ Inferenz Warren Young Jun 27 13 um 19 04. Ich sollte darauf hinweisen, dass meine Notwendigkeit für diese gleitende durchschnittliche Funktion zu bekommen ist Ein kurzes Fenster über eine ganze Reihe von ganzen Zahlen, die fast alle in den Millionen sind, also brauche ich keinen Gleitkomma Auch eine einzelne Ziffer rechts vom Dezimalpunkt ist in meiner Anwendung nicht praktisch einsetzbar. Umwandlung meiner Ganzzahlen in FP und die Ergebnis zurück zu int nur zu beschwören die F-Standard-Bibliothek doesn t appellieren Warren Young Jun 27 13 bei 19 30.Wenn Sie sich um Leistung, dann können Sie berechnen einen gleitenden Durchschnitt effizient mit etwas wie dies unter der Annahme, dass wir berechnen einen gleitenden Durchschnitt über Ein 3-Tage-Fenster. Der harte Teil über diese hält an Ihrem vorherigen laufenden Gesamt-und Anzahl N-Fenster Ich kam mit dem folgenden Code. This Version isn t so schön aussehen wie die Haskell-Code, aber es sollte vermeiden, dass Leistungsprobleme verbunden sind Mit neu zu berechnen Ihr Fenster auf jedem Lauf Es hält eine laufende Summe und hält zuvor benutzte Nummern in einer Warteschlange, so sollte es sehr schnell sein. Just zum Spaß, schrieb ich einen einfachen Benchmark. Wenn Sie sich um Leistung und wie elegante Code dann versuchen, Mit FSUnit können wir es testen. Der Trick des Algorithmus ist die erste Summe der ersten n Zahlen und dann eine laufende Summe durch Hinzufügen des Kopfes des Fensters und Subtrahieren des Schwanzes des Fensters Das Schiebefenster wird durch einen Selbstreißverschluss erreicht Auf der Sequenz aber mit dem zweiten Argument zu zip vorgerückt durch die Fenstergröße. Am Ende der Pipeline teilen wir nur die laufende Summe durch das Fenster size. Note Scan ist genau wie Falte, sondern gibt jede Version des Zustandes in eine Sequenz. Eine noch elegantere Lösung, wenn auch möglich mit Performance-Hit ist, um die Beobachtung, dass, wenn wir null Pad die Sequenz müssen wir nicht die ursprüngliche Summe zu berechnen. Es könnte ein Performance-Hit aufgrund der zweiten Indirektion im Zusammenhang mit der Umwicklung der beiden Sequenzen, aber vielleicht ist es nicht signifikant abhängig von der Größe des Fensters. answered Aug 31 12 at 8 06.NMath User's Guide. Class MovingWindowFilter ersetzt Datenpunkte fi mit einer Linearkombination, gi, der Datenpunkte sofort nach links und Rechts von fi, basierend auf einem gegebenen Satz von Koeffizienten, c, um in der linearen Kombination zu verwenden Die benachbarten Punkte werden durch die Anzahl der Punkte nach links, nL und die Anzahl der Punkte nach rechts, nR. Creating Moving Window bestimmt Filter Objects. A MovingWindowFilter-Instanz wird aus der Anzahl der Punkte links und rechts des Eingangspunktes und den Koeffizienten der Linearkombination aufgebaut. Beispielsweise konstruiert dieser Code einen asymmetrischen bewegten Fensterfilter der Länge 5.Code Beispiel C-Signal Filtering. Code Beispiel VB-Signal-Filterung. InvalidArgumentException wird erhöht, wenn die Länge des Koeffizientenvektors nicht gleich numberLeft numberRight ist 1.Static-Klassenmethoden werden für die Erzeugung von Koeffizientenvektoren von drei gemeinsamen Typen bereitgestellt. MovingAverageCoefficients konstruiert einen Koeffizientenvektor, der eine Bewegung implementiert Durchschnittlicher Filter. ExponentiellWeightedMovingAverageCoefficients konstruiert einen Koeffizientenvektor von exponentiell gewichteten gleitenden durchschnittlichen EWMA-Koeffizienten der spezifizierten Länge Wenn die Anzahl der EWMA-Koeffizienten zunimmt, erfasst der Filter höchstens 86 47 des Gesamtgewichts aufgrund der endlichen Länge des Filters. Die Filterlänge n Und das exponentielle Gewicht sind verwandt durch. SavitzkyGolayCoeffients konstruiert einen Koeffizientenvektor, der einen Savitzky-Golay-Glättungsfilter implementiert, der auch als kleinste Quadrate bekannt ist, oder DIgital-Glättung POlynomial, DISPO Die Filterkoeffizienten werden so gewählt, dass der gefilterte Punkt der Wert eines approximierenden Polynom der angegebenen Reihenfolge, typischerweise quadratisch oder quartisch Das Polynom ist unter Verwendung eines Algorithmus der kleinsten Quadrate passt. Beispielsweise konstruiert der folgende Code einen gleitenden Durchschnittsfilter, um jeden Eingangsdatenpunkt mit dem Mittelwert des Wertes und der umgebenden Punkte zu ersetzen Beispiel C Signalfilterung. Code Beispiel VB Signalfilterung. Dieser Code erzeugt einen Savitzky-Golay-Filter, der jeden Eingangsdatenpunkt mit dem Wert eines vierten Grades polynomiale Anpassung durch den Eingabewert ersetzt und dessen s umgebende Punkte. Code Beispiel C Signalfilterung. Code Beispiel VB Signalfilterung. Dieser Code erzeugt ein exponentielles gleitendes Mittelfilter der Länge 18.Code Beispiel C Signalfilterung. Code Beispiel VB Signalfilterung. Nach der Konstruktion kann das SetFilterParameters Verfahren verwendet werden, um die Filterparameter auf einer Filterinstanz zurückzusetzen. Code Beispiel C signal filtering. Code Beispiel VB signal filtering. Moving Window Filter Properties. Once konstruiert, ein MovingWindowFilter Objekt bietet die folgenden read-only properties. NumberLeft bekommt die Anzahl der Punkte auf der linken Seite für das Filter window. NumberRight bekommt die Anzahl der Punkte Rechts für das Filterfenster. WindowWidth erhält die Breite des bewegten Fensters gleich NumberLeft NumberRight 1.NumberOfCoefficients erhält die Anzahl der Filterkoeffizienten gleich WindowWidth. Coefficients erhält den Vektor der Filterkoeffizienten. Die Filtermethode auf MovingWindowFilter wendet einen Filter an Ein vorgegebener Datensatz mit der angegebenen Grenzoption. Die MovingWindowFilter-Enumeration gibt Optionen für die Handhabung der Grenzen in einem sich bewegenden Fensterfilter an, wobei der Filter nicht mit den Daten überlappt. Fügt NumberLeft-Nullen zum Anfang der zu filternden Daten hinzu und NumberRight-Nullen zu beenden. Gibt an, dass die ersten NumberLeft - und die letzten NumberRight-Daten nicht gefiltert werden. Beispielsweise konstruiert der folgende Code ein verrauschtes Cosinus-Signal und filtert dann die Daten. Code Beispiel C Signalfilterung. Code Beispiel VB Signalfilterung.
No comments:
Post a Comment