Diffsharp 中的 hessian 函数返回名为 System.Double[,] 的东西。或者,如果您将鼠标悬停在变量上,它显示为浮点数[,]。这个对象似乎有点难以解析,我不知道为什么。这个问题是相关的,但答案似乎不够笼统,因为它只处理特定大小的矩阵。
我想知道是否有人有比以下更干净的方法将这个对象按摩到密集矩阵中。返回的矩阵将始终是平方的。
我想改变这个:
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 "nnn%A"
hess |> printfn "%A"
F# 中的浮点数是 .Net 中 double 的同义词。浮点 [,] 是一个 2D 数组。您可以将其转换为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|];}