In the last two posts I introduced ndarrays, and explained the rationale and implementation details of the library. In this post I am going to show a few of the libraries that I have written using ndarrays. All of this code works in both node.js and within any browser that supports typed arrays. You can run the demos directly in node.js or else test them out in a browser using a bundler like browserify. You can click on the links for each of them to find out more details about a specific module.

## Vector arithmetic

### cwise: Array operation meta-programming library

### ndarray-ops: Common array operations

### ndarray-complex: Array operations for complex numbers

## Image processing

### get-pixels: Reads the pixels from an image as an ndarray

### save-pixels: Writes a 2D ndarray to an image file

### lena: The Lena test image as a require()able commonjs module.

### luminance: Converts an rgb image into luminance.

### normalize: Scales an ndarray to mean 0 and standard deviation 1

### ndarray-warp: Apply a non-linear warp to an ndarray

Fourier analysis

### ndarray-fft: Fast fourier transform for ndarrays

### ndarray-convolve: Convolutions and correlations for ndarrays

### phase-align: Pattern matching and alignment

### ndarray-translate-fft: Phase shifts an ndarray

## Morphology and miscellaneous stuff

### ndarray-pack: Convert a numeric.js array to an ndarray

### ndarray-moments: Calculate first few terms of moment generating function

### distance-transform: Fast distance transforms

### ball-morphology: Mathematical morphology with ball-shaped structuring elements

Conclusions

This list is by no means exhaustive, and I have been writing more modules as I need them. One of the nice things about working with CommonJS modules is that it is pretty straight forward to create your own module on npm, and reuse its functionality. I think that this style of programming could make building large scientific computing projects like SciPy/NumPy much more manageable. Each function in such a project could be decomposed into a separate module, and it would be easy to experiment with different implementations.