2016-07-13 9 views
1

Функция hessian в Diffsharp возвращает что-то, называемое System.Double [,]. Или, если вы наводите указатель на переменную, она отображается как float [,]. Этот объект кажется немного сложным для анализа, я не уверен, почему. 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. И float [,] - это 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|];}