【问题标题】:How to compare Matrix elements in Math.Net numerics in F#如何在 F# 中比较 Math.Net 数字中的矩阵元素
【发布时间】:2014-12-19 07:28:27
【问题描述】:

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())

【问题讨论】:

  • 为什么你还不够好?
  • 唯一明显的改进是使用Seq.zip而不是map2
  • 我的还不够好,因为它不得不求助于使用非 Matrix 集合类。古斯塔沃做到了。

标签: matrix f# mathnet-numerics


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多