本质上是Repa中的顺序数组变换

问题描述

| 我想知道repa中是否有(//)的类似物? 无法并行化的数组转换需要它。例如,如果函数需要整个数组更改数组的单个条目,然后将其应用于新数组,依此类推(应顺序运行)。     

解决方法

        可以使用Data.Array.Repa.fromFunction来实现“ 0”:
import Data.Array.Repa

(//) :: Shape sh => Array sh a -> [(sh,a)] -> Array sh a
(//) arr us = fromFunction (extent arr) (\\sh -> case lookup sh us of
                                                 Just a  -> a
                                                 Nothing -> index arr sh)
fromFunction
可以传递类型为
Shape sh => s -> a
的函数,该函数本身可以使用整个数组。 上面的实现一次性完成了所有更新。     ,        (//)的一个潜在问题是它需要向下搜索列表以找到每个元素的值。如果数组或列表很大,则可能会变得很昂贵。 另一个选择是利用Data.Vector中的便捷功能:
modify :: Vector v a => (forall s. Mutable v s a -> ST s ()) -> v a -> v a
如果安全的话,可以进行适当的更新。所以像
import Data.Vector.Unboxed as V
import Data.Vector.Mutable.Unboxed as M
import Data.Array.Repa as R

(///) :: Shape sh => Array sh a -> [(sh,a)] -> Array sh a
(///) arr us = R.fromVector sh . modify f $ R.toVector arr
  where
  sh = extent arr
  f mv = forM_ us $ \\(k,x) -> do
    M.write mv (R.toIndex sh k) x
在我的笔记本电脑上,我对此测试了一个100万个元素的DIM1阵列,更新了100个条目,并得到了以下时间: (//):3.598973 (///):2.0859999999999997e-3     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...