gpt4 book ai didi

arrays - 在 Haskell 中修改数组并记住索引

转载 作者:行者123 更新时间:2023-12-03 14:57:33 28 4
gpt4 key购买 nike

我需要对子数组进行转换,并且可能需要对子数组的子数组进行转换,依此类推。

在 Haskell 中是否有直观的方法来执行此操作,例如定义子数组或类似的东西?我在“haskell 的简单介绍”中阅读了有关数组的部分,但它没有解决它,而且我很难找到一种方法来做到这一点。

它用于实现匈牙利算法,如 here 所述在维基百科上。

到目前为止,我已经完成了以下工作:

import Array

step1 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a
step1 a = a // [ ((i,j), f (i,j) ) | (i,j) <- range (bounds a) ] where
f (i,j) = a!(i,j) - minRow i
minRow i = minimum [ a!(i,j) | j <- [1..(snd . snd . bounds) a] ]

step2 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a
step2 a = a // [ ((i,j), f (i,j) ) | (i,j) <- range (bounds a) ] where
f (i,j) = a!(i,j) - minCol j
minCol j = minimum [ a!(i,j) | i <- [1..(fst . snd . bounds) a] ]

问题是我不知道如何实现第 3 步和第 4 步,如果没有现成的解决方案,它会继续子矩阵上的过程。

最佳答案

我找到了一种解决方法,尽管它有点像黑客。它只适用于二维数组,即 Array (Int,Int) Int 类型的数组.这是我所做的:

import Data.Array
import Control.Applicative

updateSubArr :: [Int] -> [Int] -> (Array (Int,Int) Int -> Array (Int,Int) Int)
-> Array (Int,Int) Int -> Array (Int,Int) Int
updateSubArr rows cols f arr = arr // (zip [(i,j) | i <- rows, j <- cols ]
[ fSubArr!i | i <- range $ bounds subArr ]) where
fSubArr = f subArr
subArr = subArray cols rows arr

subArray rows cols arr = subArr where
js = length cols
is = length rows
subArr = array subBounds $ zip (range subBounds)
[ arr!(i,j) | i <- rows, j <- cols ]
subRange = range subBounds
subBounds = ((1,1),(is,js))

这是否适用于一般 Array a b ?

关于arrays - 在 Haskell 中修改数组并记住索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805991/

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