2016-07-13 2 views
1

Diffsharpのhessian関数は、System.Double [、]という名前を返します。または、浮動小数点[、]として表示されている変数にカーソルを置いた場合。このオブジェクトは少し解析するのが難しいようですが、私は理由は分かりません。 This質問は関連していますが、特定のサイズの行列のみを扱うため、答えは一般的には見えません。System.Double [、]をDenseMatrixに変換する

誰かがこのオブジェクトをDenseMatrixにマッサージするには、以下よりクリーンな方法を持っているのだろうかと思います。返される行列は常に正方形です。

私はこの変更したい:これまで

System.Double[,] 
[[-1.008660933; 9.992007222e-06] 
[9.992007222e-06; 0.4999911596]] 

をしかしきれい:ここで

MathNet.Numerics.LinearAlgebra.Double.DenseMatrix 
DenseMatrix 2x2-Double 
    -1.00866 9.99201E-06 
9.99201E-06  0.499991 

は私のコードです。これは、F#コードの残りの部分の中でちょっと厄介なように見えます。

let hessianToMatrix (h: float[,]) = 
    let v = h |> Seq.cast<float> |> Seq.toArray |> DenseVector 
    let dim = float v.Count |> sqrt |> int  
    let m = DenseMatrix.init dim dim (fun i j -> 0.) 
    for r in 0 .. dim-1 do 
     for c in 0 .. dim-1 do 
      m.[r, c] <- v.[r*dim + c] 
    m 

let hess = hessian llNormal [|5.; 1.|] |> hessianToMatrix 
hess.GetType() |> printfn "\n\n\n%A" 
hess |> printfn "%A" 

答えて

4

float in F#は、.Netのdoubleと同義語です。 float [、]は2次元配列です。あなたがDensematrixに変換することができます:

let rnd = System.Random() 
let x2d = Array2D.init 2 2 (fun i j -> rnd.NextDouble()) 
x2d |> DenseMatrix.ofArray2 

を私が取得:

val it : Matrix<float> = 
    DenseMatrix 2x2-Double 
0.438629 0.462749 
0.386625 0.740308 

{ColumnCount = 2; 
Item = ?; 
RowCount = 2; 
Storage = MathNet.Numerics.LinearAlgebra.Storage.DenseColumnMajorMatrixStorage`1[System.Double]; 
Values = [|0.4386289918; 0.3866254107; 0.4627486283; 0.7403077645|];} 
関連する問題