在这样的lambda函数中不能使用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