2016-07-09 14 views
1

In meinem Bemühen, von der Verwendung nativer F # -Typen auf Math.NET Numerics Typen zu verschieben, wäre ein Beispiel hilfreich.Übersetzen von Operationen auf native Typen in Math.NET Numerics

Wie würde das Folgende als eine Operation auf DenseMatrix oder DenseVector Typen ausgedrückt werden? Ich habe mit dem folgenden Abschnitt herumgespielt, um zu versuchen, alle Container als Math.NET-Typen auszugeben, behielt aber eine Reihe von Fehlern.

open MathNet.Numerics 
open MathNet.Numerics.LinearAlgebra 
open MathNet.Numerics.Random 
open MathNet.Numerics.Distributions 
open MathNet.Numerics.Statistics 

let Tsize = 10 
let Tsamps = 5 

let expLL (arr : float []) = 
    arr |> Array.average 

let arrL = Array.init Tsamps ( 
       fun i -> 
       [| 
        for i in 1 .. Tsize do 
         yield Exponential.Sample(1.) 
       |] |> expLL 
      ) 

Außerdem, was ist der schnellste Weg, ein float [] oder ein float [] [] zu einem DenseMatrix zu konvertieren?

Danke.

Antwort

3

Ich denke nicht, dass es etwas an Ihrem Beispiel gibt, das anders gemacht werden muss - Math.NET bietet eine schöne Funktionalität für lineare Algebra, aber Sie machen hier keine Matrix- oder Vektorberechnungen, also funktionieren einfache Arrays Alles gut. Wenn Sie das Ergebnis in einen Vektor drehen wollen, habe ich wahrscheinlich so etwas wie diese (mit geringfügigen zwicken zu vermeiden, zu lange Linien) schreiben würde:

let sample() = Array.init Tsize (fun _ -> Exponential.Sample(1.0)) |> expLL  
let vecL = vector [ for i in 1 .. Tsamps -> sample() ] 

Wie für Daten in Matrizen drehen, gibt es eine matrix Funktion:

let nested = [ [1.0; 2.0; 3.0]; [4.0; 5.0; 6.0] ] 
let m = matrix nested 
+1

Die expLL-Funktion hier ist trivial, aber das ist wahrscheinlich der Punkt, an dem die meisten meiner linearen Algebra wahrscheinlich sind. Also brauche ich dafür Matrix-Objekte. Aber ich denke, ich sehe es jetzt. –