Hi all,
I'm interested in views on what should be the focus in terms of improving core.matrix implementations. I'm going to spend some time on Clojure numerical coding over the next few months, so would like to be aware of what people would find most useful so that I can improve things where I can.
Just as a reminder: We currently have three reasonably complete core.matrix implementations:
Some additional context:
- Of the implementations above, vectorz-clj is usually the fastest for most operations, although Clatrix wins for a few operations on large matrices thanks to the BLAS optimisations (matrix multiply etc.)
- The work that Dragan Djuric has done on Neanderthal has shown that it's possible to get even better performance than Clatrix with smarter JNI interfaces. This doesn't yet have core.matrix support, but it could easily be added (just some protocol implementations needed).
- I've experimented a bit and think that it would be relatively easy to add the same native optimisations as Neanderthal to vectorz-clj (see e.g.:
https://github.com/mikera/vectorz-native which uses the neanderthal-atlas JNI bindings to add native support to Vectorz)
I can see a bunch of opportunities to improve core.matrix implementations, e.g.:
a) Focus on pure-JVM implementation (improve vectorz-clj)
b) Focus on native implementation (either improve Clatrix, make Neanderthal work as a core.matrix implementation, or create a vectorz-clj native implementation)
c) Focus on alternative implementations (complex numbers, Spark integration, GPU implementations etc.)
d) Extend core.matrix itself (both in terms of API and default implementations for Clojure data structures)
e) Forget implementations and work on documentation, examples etc.
I'd love to hear views on what people think is most valuable right now.
As always, actual improvements happen based on what people are interested and motivated to contribute, but understanding what is in most demand is a good start!
Mike.