0

この質問では、PowerPack を使用して同様の操作を行う方法を尋ねました。F# だけでなく、一般的な .Net 用に設計されているため、代わりに MathNet を使用することにしました。

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

1 に答える 1

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
于 2014-12-19T08:18:50.297 に答える