2017-01-22 50 views
0

我有一个由0和1组成的一维Repa数组,我想计算其运行长度编码。 例如:转[0,0,1,1,1,0,0,0,1,0,1,1] into [2,3,3,1,1,2]或类似的东西。 (由于可读性,我使用列表表示法)Repa数组的行程编码

理想情况下,我想要1的运行长度并忽略0。 所以[0,0,1,1,1,0,0,0,1,0,1,1] becomes [3,1,2]

我想结果也是(Repa)数组。

如何使用Repa来做到这一点?我不能使用maptraverse,因为它们一次只给我一个元素。我可以尝试fold与一些特殊类型的累加器,但这似乎并不理想,我不知道它甚至可能(由于monad法则)。

+0

是你的数组吗?如果不是:你想要每行的编码还是n-dim事物的一维表示? – sdx23

+0

@ sdx23我的数组是一维的。 – Valerie94

+0

修理不是为这种事情做的。你会更好地使用其他任何东西......为什么你需要维修? – Alec

回答

0

我目前只是迭代数组并返回一个列表,而不使用任何Repa函数。我正在研究Boolean而不是1和0,但算法是一样的。之后我将这个列表转换为Repa阵列。

runLength :: Array U DIM1 Bool -> [Length] 
runLength arr = go ([], 0, False) 0 arr 
    where 
    Z :. n = extent arr 
    go :: Accumulator -> Int -> Array U DIM1 Bool -> [Length] 
    go [email protected](xs, c, b) !i !arr | i == n = if c > 0 then c:xs else xs 
           | otherwise = 
           if unsafeIndex arr (Z :. i) 
           then if b 
             then go (xs, c+1, b) (i+1) arr 
             else go (xs, 1, True) (i+1) arr 
           else if b 
             then go (c:xs, 0, False) (i+1) arr 
             else go (xs, 0, False) (i+1) arr 
+0

我不知道这是如何比较一般的'地图(长度&&&头部)。组。 toList' – Cirdec

+1

@Cirdec设置如下:1.我从一个文件中读取所有的样本并将它们转换为布尔值。我调用runLength来计算游程长度编码。 3.我将结果打印到标准输出。 使用我的功能,平均需要0.013s。使用你的功能,平均需要0.249s。使用你的函数,我仍然需要从结果中提取True值的运行长度。 – Valerie94