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