2

行列の非ゼロ要素をに集めたいsequence<(row,column,value)>

これは機能しません

let getSparseMatrixCOO matrix =
    seq {
          matrix |> Array2D.iteri (fun row column elem -> 
                                    if elem <> 0.0 then yield (row, column, elem)
                                  )
        }

使用するという考えをあきらめる必要がありArray2D.iteriますか?

4

2 に答える 2

4

yieldこのようにラムダ関数内で使用することはできません。キーワードは、シーケンス式のyieldスコープ内でのみ直接使用できます (ただし、試みには適切なロジックがあります)。

最も簡単なオプションは、配列の要素を反復処理して、次のように記述することだと思います。

let getSparseMatrixCOO matrix =
  seq { for row in 0 .. Array2D.length1 matrix - 1 do
          for column in 0 .. Array2D.length2 matrix - 1 do
            let elem = matrix.[row, column]
            if elem <> 0.0 then yield (row, column, elem) }

モジュールは多くのArray2D機能を提供しませんが、拡張して機能を含めることができますfoldi( と同様Array.foldi)。この関数は、配列の要素を集約し、すべての要素に対して指定した関数を呼び出します。次に、必要な要素を選択し、必要な方法でそれらを集約できます。

次の例では、リストを状態として使用し、集計中にゼロ以外の要素をリストに追加します。

Array2D.foldi (fun row column elem state -> 
  if elem <> 0.0 then (row, column, elem)::state else state) []

欠落しているArray2D.foldi関数は、次のように実装できます (単純にするために必須です)。

module Array2D =
  let foldi f a matrix = 
    let mutable state = a
    for row in 0 .. Array2D.length1 matrix - 1 do
      for column in 0 .. Array2D.length2 matrix - 1 do
        state <- f row column (matrix.[row, column]) state
    state
于 2012-10-25T17:03:29.687 に答える
1

Array2D.iteriあなたは次のようなことに固執し続けるかもしれません

let getSparseMatrixCOO matrix =
    let result = ref List<int*int*float>.Empty
    matrix |> Array2D.iteri(fun i j elem -> if elem <> 0.0 then result := (i,j,elem)::!result)
    !result |> List.rev

上記のスニペットが同じシーケンスを熱心に提供するため、元の意図の怠惰が問題にならない場合。

于 2012-10-25T17:51:16.080 に答える