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

标签 arrays haskell indexing fold repa

在 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/

相关文章:

c - 在 O(log n) 时间内找到连续整数数组中的重复元素

algorithm - 在 Haskell 中表示计算图

php - 可以通过索引访问 PHP parse_str 数组值吗?

c++ - 我的程序只读取半个数组 c++

javascript - 如何有效地检查数组中的任何子字符串是否包含在另一个字符串中

haskell - 类定义中的管道是什么意思?

graphics - 如何查看 Functional MetaPost 的输出 .mp 文件

java - 如何删除 ArrayList 的项目并更新元素的索引

甲骨文 SQL : Single Index with two Columns vs index on one Column

SQLite "INDEXED BY"在 SELECT 中不工作