gpt4 book ai didi

f# - 使用 Array2D 时是否可以返回 seq?

转载 作者:行者123 更新时间:2023-12-02 05:26:06 25 4
gpt4 key购买 nike

我想将矩阵的非零元素收集到 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 的想法? ?

最佳答案

您不能像这样在 lambda 函数中使用 yieldyield 关键字只能在序列表达式的范围内直接使用(尽管您的尝试具有良好的逻辑)。

我认为最简单的选择是遍历数组的元素并编写如下内容:

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

关于f# - 使用 Array2D 时是否可以返回 seq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com