Как сравнить элементы Matrix в числовых значениях Math.Net в F#

В этом вопросе я спросил, как проделайте аналогичную операцию с помощью PowerPack. Вместо этого я решил использовать MathNet, так как он предназначен для .Net в целом, а не только для F#.

Мне нужна функция, которая принимает 2 матрицы и выводит процент согласия. Все значения в матрицах равны 1,0 или -1,0. Видимо матрицы типа Matrix(int) не поддерживаются.

Я придумал функцию, которая выполняет это, но я подозреваю, что есть более прямой способ сделать это, предпочтительно используя функциональные возможности класса Matrix.

Вот что у меня есть:

let percentageTheSame (a:Matrix<float>) (b:Matrix<float>) =
  let seqA = a |> Matrix.toSeq
  let seqB = b |> Matrix.toSeq
  let sames = Seq.map2 (fun a b -> (a,b)) seqA seqB |> Seq.filter (fun (a, b) -> a = b)
  float(sames.Count())/float(seqA.Count())

person Chechy Levas    schedule 19.12.2014    source источник
comment
И почему то, что у вас есть, недостаточно хорошо?   -  person scrwtp    schedule 19.12.2014
comment
Единственное очевидное улучшение — использовать Seq.zip вместо map2.   -  person John Palmer    schedule 19.12.2014
comment
Мой недостаточно хорош, потому что ему приходится прибегать к использованию класса коллекции, отличного от Matrix. Густаво попал в точку.   -  person Chechy Levas    schedule 19.12.2014


Ответы (1)


Вот решение, похожее на решение с использованием PowerPack:

let percentageTheSame (a:Matrix<float>) (b:Matrix<float>) =
  let z,t = Matrix.fold (fun (z,t) e -> (if e = 0. then z+1 else z), t+1) (0,0) (a-b)
  float z / float t

Или использование foldi вместо вычитания матриц может быть более эффективным для больших матриц, поскольку не нужно выделять промежуточную матрицу:

let percentageTheSame (a:Matrix<float>) (b:Matrix<float>) =
  let z,t = 
    Matrix.foldi (fun i j (z,t) e -> (if e = b.[i,j] then z+1 else z), t+1) (0,0) a
  float z / float t
person Gus    schedule 19.12.2014
comment
Интересно, что не существует никакой документации по функции foldi для матричного класса: numerics.mathdotnet.com/api/MathNet.Numerics.LinearAlgebra/ - person Chechy Levas; 19.12.2014
comment
Может быть, это только в компоненте F # MathNet. - person Gus; 19.12.2014