F# 使用Array2D时是否可以返回seq?
我想将矩阵的非零元素收集到序列中 这不管用F# 使用Array2D时是否可以返回seq?,f#,F#,我想将矩阵的非零元素收集到序列中 这不管用 let getSparseMatrixCOO matrix = seq { matrix |> Array2D.iteri (fun row column elem -> if elem <> 0.0 then yield (row, column, elem)
let getSparseMatrixCOO matrix =
seq {
matrix |> Array2D.iteri (fun row column elem ->
if elem <> 0.0 then yield (row, column, elem)
)
}
让getSparseMatrixCOO矩阵=
序号{
矩阵|>Array2D.iteri(有趣的行-列元素->
如果元素为0.0,则屈服(行、列、元素)
)
}
我必须放弃使用
Array2D.iteri
?在这样的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) }
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
缺少的Array2D.foldi
函数可以这样实现(为了保持简单,必须这样做):
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) }
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
模块阵列2d=
设foldi f a矩阵=
设可变状态=a
对于0中的行。。阵列2D.length1矩阵-1 do
对于0中的列。。阵列2D.Length 2矩阵-1 do
state您可以继续坚持使用以下内容
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
让getSparseMatrixCOO矩阵=
让result=ref List.Empty
矩阵|>Array2D.iteri(有趣的元素->如果元素0.0,那么结果:=(i,j,元素)::!结果)
!结果|>List.rev
如果你的原始意图的懒惰并不重要,因为上面的片段会给你相同的顺序,只是渴望而已