问题标签 [repa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - 从文件中读取样本到数组中
我编写了一个程序来分析包含文件的样本数据。目前,我的程序将样本读入一个列表,然后我对样本列表 ( [Float]
) 执行进一步的分析/处理。
我对性能不太满意,我正在考虑使用数组而不是列表来获得更好的性能。我也在研究并行化我的实现,Data.Array.Repa
看起来很有希望。
目前,从文件中读取是这样的:
- 我将所有样本读入一个
ByteString
, 使用hGet
. - 我知道每个样本由 3 个字节表示,所以我将s分组
ByteString
为 3 个的列表。ByteString
- 我将我的
toFloat
函数映射ByteString
到 s 列表上以获取Float
s 列表。
这导致[Float]
我分析以获得所需的信息。
我想知道我应该在这个过程的哪个步骤开始使用数组。我首先想到的是使用该listArray
函数将 my[Float]
转换为浮点数组。我不确定,但这似乎不是最有效的方法。
是否可以Data.Array.Repa.fromFunction
在步骤 2 之后立即使用构造数组并跳过中间[Float]
?对于该功能,我可以使用类似的东西(map toFloat bsList)
吗?分组后bsList
的 s 列表在哪里。ByteString
或者有没有办法将样本直接读入数组?
arrays - Repa 数组的行程编码
我有一个由 0 和 1 组成的一维Repa
数组,我想计算它的游程编码。例如:转弯[0,0,1,1,1,0,0,0,1,0,1,1] into [2,3,3,1,1,2]
或类似的东西。(由于可读性,我使用列表表示)
理想情况下,我想要 1 的运行长度并忽略 0。所以[0,0,1,1,1,0,0,0,1,0,1,1] becomes [3,1,2]
。
我希望结果也是一个 ( Repa
) 数组。
我怎样才能做到这一点Repa
?我不能使用map
,或者traverse
因为他们一次只给我一个元素。我可以尝试fold
使用某种特殊的累加器,但这似乎并不理想,我什至不知道它是否可能(由于单子定律)。
haskell - DIM1 Repa 阵列与向量的性能
我编写了一个程序来使用Repa处理大量数据样本。性能是该程序的关键。大部分操作需要多维数组上的并行映射/折叠,Repa
非常适合此操作。但是,我的程序中仍有一部分只使用一维数组并且不需要并行性(即并行性的开销会损害性能)。其中一些操作需要带有自定义累加器的take
or s 之类的函数,而这些函数不支持。所以我自己通过遍历数组来编写这些操作。fold
Repa
Repa
我是否最好使用Vector而不是重写这些操作Repa
?它们会带来更好的性能吗?
我在某处读到一维Repa
数组被实现为Vector
s 'under the hood' 所以我怀疑这会带来Vector
更好的性能。另一方面,Vector
确实有一些不错的内置函数,我可以使用它们而不是自己编写它们。
multithreading - 并行调用 HMatrix(或一般的 FFI)
我正在使用 repa 库(3 和 4)在 haskell 中处理点云。至少我正在努力。
在并行性确实有很大帮助的情况下,我需要大量执行一些操作。其中大多数是对点的(度量)邻域的简单线性代数运算。例如,我需要在每行都是一个点的小矩阵上计算 SVD 的主成分分析。
现在我使用线性包作为向量类型
以及用于点云的这些向量的一维数组
所以现在我遇到了使用computeP并行调用hmatrix矩阵分解的函数的问题。我为此尝试了 hmatrix 本身以及 repa -linear-algebra包。我遇到的问题是,对于所有这些调用(无论我如何提供数据,无论我调用什么(svd、特征分解、qr decomp 等)),应用程序总是会因总线错误或段错误而随机崩溃。
我也没有找到任何方法来获得至少可以为我指明正确方向的任何堆栈跟踪。堆栈跟踪通常在 pthread 结束。
此外,我编写了自己的 C 代码,我称之为:
这在具有 20 个并行内核的大型点云上运行良好。从未以任何方式坠毁。
现在我非常模糊的想法是 hmatrix 用“安全”调用 C/Fortran 代码,从而允许 pthread 分叉并且实际上不是线程安全的。我无法尝试验证这个假设,因为调试对于 haskell 工具链来说似乎是一个陌生的概念(至少对于我这样一个完整的新手来说)。
总之,我有三个问题:
- 是否已知 hmatrix 存在并行工作的问题
- 有没有人致力于这些基本算法的本地实现?
- 如何防止 FFI 包装的代码在无法访问导入调用的情况下生成 fork() 的线程?
- 如何调试 hmatrix 之类的东西?
第二个是我特别感兴趣的,因为我发现 hmatrix 非常丑陋(subhask 看起来很有希望,但太不完整以至于不可行)。我的目标是改用haskell,但如果我必须使用我自己的C++代码来处理上述任何琐碎的事情,我可以像现在一样继续用C++编码......
arrays - Yarr 切片用法
我一直在探索 Data.Yarr Array 库,作为我在 Repa 中的一些代码的可能替代品。它似乎功能齐全,并且基准测试-如果正确表明可能会提高性能。
我对 slices 函数的正确使用很感兴趣。
假设我有一个复杂浮点数的二维 ForeignPtr 支持矩阵,采用行主要格式
我将如何提取列和/或行切片的向量?
一个励志的例子?假设我希望置换列,将每个元素与另一组切片相乘,然后对每个切片执行 1D FFT。
这似乎是一件很常见的事情(在我的信号处理领域)。这样做的惯用方式是什么?
编辑:减少问题的范围。
arrays - 无法在 Haskell repa 数组中将类型“D”与“U”匹配
我正在尝试编写一些简单的反向替换矩阵代码。为此,我编写了一个fold
与行折叠的运算符。
这是函数的非泛型类型签名及其实现:
- repa's 等与上述折叠的区别在于
foldS
,foldP
折叠函数将 2 个DIM1
延迟数组作为参数。 - 更重要的是,为了帮助循环融合,它返回一个延迟数组 (
Array D DIM1 Double
)。
以下是反向替换的代码
- 为了帮助循环融合我,故意使
initial
延迟。matRow
计算delayNRow
它还计算一个延迟数组(delayNRow
代码在下一个项目符号之后提供)。 fromFunction
类型签名肯定会返回一个延迟的数组。delayNRow :: Array U DIM2 Double -> Int -> Array D DIM1 Double
delayNRow arr n = R.slice arr (Any :. n :. All)
但问题是:
为什么我会收到以下错误:
tldr;
为什么我得到输入到数组的错误f
,backsubstitution
而U
我为它们提供延迟的数组(D
)。
haskell - 向量的向量到 2D Repa 数组
将未装箱双精度向量的Vector转换为repa 的最简洁方法是Array U DIM2 Double
什么?
最明显的方法是将所有未装箱的向量连接成一个并将其传递给fromUnboxed,但这感觉有点笨拙。有更好的选择吗?
haskell - 如何在 Repa 中按索引上的谓词进行过滤
我有两个 Repa 数组a1
,a2
并且我想消除a2
其中相应索引a1
高于某个阈值的所有元素。例如:
一种方法是使用,selectP
但我想避免使用它,因为它计算数组,如果可能的话,我希望我的数组保持延迟形式。
另一种方法是使用repa-array
,但stack solver
似乎不知道如何使用解析器导入此库nightly-2017-04-10
。
haskell - Monadic QuickCheck 测试不适用于任意 Repa 数组
我正在尝试在 Haskell 中为任意 Repa 数组编写测试。出于某种原因,以下代码段:
抛出此异常:
我不确定如何解释这些信息。谢谢你的帮助。
haskell - 包装 Repa 数组的可变内部类型
我正在尝试围绕repa编写一个瘦包装器,以为我正在做的一些特定领域的工作提供额外的约束。我有类型:
从哪里来。Array
_ repa
我想隐藏它,r
因为它会为类型签名添加噪音并产生Tile
泄漏的抽象:
不幸的是,这r
可能会在 repa 操作之间发生变化。大多数时候它是D
(对于“延迟表示”),但是当第一次从列表或向量创建数据时,它将是U
(“未装箱的向量”)或V
(“装箱的向量”)。这些用作类型提示以帮助 repa 优化其操作。
有没有办法让我隐藏r
我想要的,但允许它在内部自然变化而不影响我的包装器类型的Tile
类型检查?这是RankNTypes
和朋友的域名吗?我承认我不太了解他们。最清楚的是,我希望能够写:
foo :: Tile p a -> Tile p b -> Tile p c
其中两个Tile
参数分别包含(例如)anArray U DIM2 Int
和Array D DIM2 Int
。渴望这是一件坏事吗?