在this question中,我询问了如何使用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())
答案 0 :(得分:2)
这是一个类似于使用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