作为 python 模拟的一部分,我有一个二维数组并获取这个数组的梯度。这是在 scipy/numpy 中通过将二维数组与具有适当权重的过滤器进行卷积来完成的。
所以我的问题是,如果我想在 clojure 中以相当快的速度执行此操作,在纯 clojure 中执行此操作是否有意义,或者使用 Java 图像处理库并从 clojure 调用它是否更好?
作为 python 模拟的一部分,我有一个二维数组并获取这个数组的梯度。这是在 scipy/numpy 中通过将二维数组与具有适当权重的过滤器进行卷积来完成的。
所以我的问题是,如果我想在 clojure 中以相当快的速度执行此操作,在纯 clojure 中执行此操作是否有意义,或者使用 Java 图像处理库并从 clojure 调用它是否更好?
Clojure 中经过良好优化的循环将具有接近 Java 代码的性能。
我会建议使用原始向量或直接来自 clojure 的数组来获得非常好的性能。
我已阅读有关该主题的博文: http ://www.bestinclass.dk/index.clj/2010/03/functional-fluid-dynamics-in-clojure.html
好的过程是从清晰且有效的代码开始,然后再进行调整以提高性能。
通常,Clojure 中的性能围绕着摆脱反射和使用原语。这在这里解释:http: //clojure.org/java_interop
您可以使用 Clojure 中的 Java 图像处理库。这是开始的事情。
(defn getPixels [^BufferedImage image] (-> image .getRaster .getDataBuffer .getData))
我不知道这是否会编译(我有一些帮助)我只是从我脑海中的一些 Scala 代码中翻译了它。
如果您真的想要最佳性能,您可能需要在本机代码中进行计算(据我了解,这就是 NumPy 所做的)。我们在之前的项目中使用了JAI,它运行良好,但我们没有将它用于任何高级的东西。它似乎确实支持kernels和convolutions,因此它可能适用于您的目的。但是,我不相信它像 NumPy 那样灵活。