vectorz-clj is designed so that you don't have to compromise, offering both:
- An idiomatic high-level Clojure API using core.matrix
- General purpose multi-dimensional arrays
- High performance (about as fast as you can get on the JVM). vectorz-clj is currently the fastest pure-JVM vector/matrix library available for Clojure
The library was originally designed for games, simulations and machine learning applications,
but should be applicable for any situations where you need numerical
- "Pure" functions for an idiomatic functional programming style are provided. These return new vectors without mutating their arguments.
- Primitive-backed special purpose vectors and matrices for performance, e.g.
Vector3for fast 3D maths.
- Flexible DSL-style functions for manipulating vectors and matrices, e.g. the ability to create a "view" into a subspace of a large vector.
- core.matrix fully supported - see: https://github.com/mikera/core.matrix
- Pure cross-platform JVM code - no native dependencies
- "Impure" functions that mutate vectors are available for performance when you need it: i.e. you can use a nice functional style most of the time, but switch to mutation when you hit a bottleneck.
vectorz-clj is intended to be used primarily as a
core.matrix implementation. As such, the main API to understand is
core.matrix itself. See the
core.matrix wiki for more information:
For more information about the specific details of vectorz-clj itself, see the vectorz-clj Wiki.
vectorz-clj requires Clojure 1.4 or above, Java 1.7 or above, and an up to date version of core.matrix
vectorz-clj is reasonably stable, and implements all of the core.matrix API feature set.
vectorz-clj is licensed under the LGPL license:
Follow the instructions to install with Leiningen / Maven from Clojars:
You can then use
Vectorz as a standard
core.matrix implementation. Example:
(use 'clojure.core.matrix) (use 'clojure.core.matrix.operators) ;; overrides *, + etc. for matrices (set-current-implementation :vectorz) ;; use Vectorz as default matrix implementation ;; define a 2x2 Matrix (def M (matrix [[1 2] [3 4]])) M => #<Matrix22 [[1.0,2.0][3.0,4.0]]> ;; define a length 2 vector (a 1D matrix is considered equivalent to a vector in core.matrix) (def v (matrix [1 2])) v => #<Vector2 [1.0,2.0]> ;; Matrix x Vector elementwise multiply (mul M v) => #<Matrix22 [[1.0,4.0],[3.0,8.0]]> ;; Matrix x Vector matrix multiply (inner product) (inner-product M v) => #<Vector2 [5.0,11.0]>
For more examples see Wiki Examples