Clojure 中的可插拔向量处理单元

Posted

技术标签:

【中文标题】Clojure 中的可插拔向量处理单元【英文标题】:Pluggable vector processing units in Clojure 【发布时间】:2011-04-27 14:06:43 【问题描述】:

我正在 Clojure 中开发一些模拟软件,它需要处理大量矢量数据(基本上源自 Java 浮点数组的偏移量,长度通常在 10-10000 范围内)。大量这些向量将需要经过各种处理步骤 - 例如对向量进行归一化,将两个向量流连接在一起,计算移动平均值等。

我希望做的不是以命令式的方式做所有事情,而是创建一个更具函数式风格的 Clojure 解决方案,该解决方案将执行以下操作:

允许将任何向量函数转换为可插入模块,例如(def module-a (make-module some-function)) 允许这些模块组成管道,例如(def combined-module (combine-in-series module-a module-b)) 将 module-a 的输出馈送到 module-b 的输入 允许辅助功能访问存储在给定模块中的状态,例如(get-moving-average some-moving-average-module),即使 some-moving-average-module 嵌入到组合管道的深处,它也需要工作 隐藏任何样板代码在幕后,例如为向量计算分配足够大的临时数组。

这听起来是一种明智的做法吗?

如果是这样,任何可能有帮助的实现提示或库?

【问题讨论】:

【参考方案1】:

在函数式语言中,一切都是数据流。您可以使用函数作为您的模块概念。

解决您的每个用例:

pluggagble 模块 是一个 Clojure 函数,它接受一个参数,即数据向量的状态。例如(def module-a some-function) 为了便于通过模块进行扩展,我建议使用 Clojure 映射作为您的状态,其中一个字段是您的浮点数组。 组合模块是功能组合。例如(def combined-module (compose module-a module-b) 辅助函数是访问函数,从数据中提取状态。例如如果您的数据是带有 :moving-average 字段的 Clojure 映射,则关键字 :moving-average 是您的访问器函数。状态不存储在模块中。 样板代码隐藏在函数的实现中,可以在任何地方声明,可能在另一个文件和命名空间中。

【讨论】:

【参考方案2】:

结帐管道。 http://intensivesystems.net/tutorials/conduit-motive.html

【讨论】:

以上是关于Clojure 中的可插拔向量处理单元的主要内容,如果未能解决你的问题,请参考以下文章

什么是Clojure的可折叠系列?

在 Clojure 中将嵌套向量减少为另一个向量

在 Clojure 中,如何合并两个地图向量?

为啥没有窥视! clojure 瞬态向量的函数?

包含混合向量和双精度的向量的 Clojure 减少函数

在 Clojure 中添加向量的惯用方法是啥?