gpt4 book ai didi

arrays - Haskell repa - 如何减少数组并返回索引?

转载 作者:行者123 更新时间:2023-12-01 19:42:15 26 4
gpt4 key购买 nike

在 GNU Octave 中此代码 -

[e, ix] = min(X);

将返回最小元素及其位置。 如何在 repa 中实现任意二进制函数?

这是我想到的:

min x = z $ foldl' f (e,0,0) es
where
(e:es) = toList x
f (a,ix,r) b = let ix' = ix+1 in if a < b then (a,ix',r) else (b,ix',ix')
z (a,ix,r) = (a,r)

在上面的示例中,我们将 repa 一维矩阵转换为列表,并使用带有两个累加器的 Foldl'(来自 Data.List) - 一个用于计数迭代 (ix),另一个用于保存最小元素 (r) 的位置。但使用 repa 的重点是使用数组,而不是列表!

在repa中,数组类型有两个折叠(foldS和foldP) - 但它们只能接受类型的函数(a -> a -> a) - 这意味着,我无法将带有累加器的元组传递给它。还有遍历,原则上可以将一维数组简化为标量数组:

min x = traverse x to0D min
where
to0D (Z:.i) = Z
min f (Z) = ??? -- how to get elements for comparison?

第一个想到的是

[f (Z:.i) | i <- [1..n]], where n = (\(Z:.i) -> i) $ extent x

但这也会将数组转换为列表,而不是对数组进行计算。

最佳答案

我不是 Repa 方面的专家,但这似乎适用于一维数组。它可能可以适应其他尺寸。

import Data.Array.Repa

indexed arr = traverse arr id (\src idx@(Z :. i) -> (src idx, i))

minimize arr = foldP f h t
where
(Z :. n) = extent arr
arr' = indexed arr
h = arr' ! (Z :. 0)
t = extract (Z :. 1) (Z :. (n-1)) arr'
f min@(valMin, iMin) x@(val, i) | val < valMin = x
| otherwise = min

关于arrays - Haskell repa - 如何减少数组并返回索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13570354/

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