Clojure中的可插入矢量处理单元
-
09-10-2019 - |
题
我正在开发一些Clojure中的仿真软件,这些软件将需要处理大量矢量数据(基本上是作为偏移源成Java Floats的阵列,长度通常在10-10000范围内)。这些向量中的大量将需要经过各种处理步骤 - 例如使向量归一化,将两个向量流在一起,计算移动平均值等。
我希望做的不是以命令式的方式做所有事情,而是创建一个更具功能性的Clojure解决方案,该解决方案将执行以下操作:
- 允许任何向量函数变成 可插入的模块, ,例如(def module-a(make-module some函数))
- 允许这些模块为 由管道组成, ,例如(def组合模块(组合串行模块-A模块-B))将使模块A的输出输出到模块-B的输入中
- 允许 辅助功能 要访问在给定模块中存储的状态,例如(流动 - 平均移动平均模块),即使将某些移动平均模块嵌入到合并的管道中,也需要工作
- 隐藏任何样板代码 在幕后,例如为矢量计算分配足够大的临时阵列。
这听起来像是一种明智的方法吗?
如果是这样,任何实施暗示或库可能会有所帮助?
解决方案
在功能语言中,一切都是数据流。您可以将函数用作模块概念。
解决您的每个用例:
- 一个 Pluggagble模块 是一个clojure函数,它采用单个参数,该参数是您数据向量的状态。例如
(def module-a some-function)
为了允许模块轻松扩展,我建议使用clojure地图作为您的状态,其中一个字段是您的浮子数组。 - 组成模块 是功能组成。例如
(def combined-module (compose module-a module-b)
- 辅助功能 是登录机功能,从数据中提取状态。例如,如果您的数据是带有一个带有的clojure地图
:moving-average
字段,然后是关键字:moving-average
是您的登录功能。状态不存储在模块中。 - 样板代码 隐藏在您的函数的实现中,可以在任何地方声明,可能在另一个文件和名称空间中声明。
不隶属于 StackOverflow