将System.Double [,]转换为DenseMatrix

时间:2016-07-13 01:28:52

标签: f# mathnet mathdotnet diffsharp

Diffsharp中的hessian函数返回一个名为System.Double [,]的东西。或者,如果您将鼠标悬停在变量上,则显示为float [,]。这个对象似乎有点难以解析,我不知道为什么。 here问题是相关的,但答案似乎不够普遍,因为它只处理特定大小的矩阵。

我想知道是否有人比以下任何人更清洁地按摩这个物体到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"

1 个答案:

答案 0 :(得分:2)

float in F#是.Net中double的同义词。而float [,]是一个二维数组。您可以将其转换为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|];}