scijs/ndarray-band

Name: ndarray-band

Owner: scijs

Description: Create a view of a band of an ndarray

Created: 2015-06-25 01:54:04.0

Updated: 2016-12-13 06:54:30.0

Pushed: 2015-07-27 03:32:31.0

Homepage: null

Size: 232

Language: JavaScript

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

ndarray-band

Build Status npm version Dependency Status

Create a view of a band of an ndarray

Introduction

First things first, if bands are meaningful in your matrix problem, there's a chance you should really just be dealing with the bands directly using algorithms designed to work with, for example, tridiagonal or Toeplitz matrices. But if you need a band, then this module provides a convenience function to extract a view of a band, i.e. a diagonal with an offset.

Note that for an ndarray of dimension d, since the band is a one-dimensional array, only d-1 offsets are necessary. Thus, the offsets are given for dimensions 1, 2, \ldots, d-1.

Also note that for dimensions greater than two, this gets a little confusing. Here's a more precise specification that's not exactly less confusing, but at least it's precise: Given an array A and offsets \mathrm{offset}_1, \mathrm{offset}_2, …, \mathrm{offset}_{d-1}, ndarray-band returns a view of A at

A(\mathrm{offset}_1 + i_1 + i, \mathrm{offset}_2 + i_1 + i,\; \ldots,\;\mathrm{offset}_{d-1} + i_1 + i, i_1 + i)

where i_1 is the the first element that falls within the bounds of A and i is the index of the view starting at zero. The length of the band will be such that it only ever contains element within the bounds of A.

To make that actually concrete, the bands of a 3 \times 4 matrix are indexed like:

\left[ \begin{array}{cccc}
c_0 & d_0 & e_0 & f_0 \\
b_0 & c_1 & d_1 & e_1 \\
a_0 & b_1 & c_2 & d_2
\end{array}\right]

Example

Consider constructing the 10 \times 10 1-D discrete Laplacian operator. Of course in any realistic problem you'd obviously want to avoid constructing this at all costs, but there are cases where it's necessary or at least useful to refer to a band view.

pool = require('ndarray-scratch'),
ops = require('ndarray-ops'),
band = require('ndarray-band')

A = pool.zeros([10,10])

assigns( band(A,-1),  1 )  // (superdiagonal)
assigns( band(A, 0), -2 )  // (diagonal)
assigns( band(A, 1),  1 )  // (subdiagonal)

      [ -2    1    0    0    0    0    0    0    0    0 ]
      [  1   -2    1    0    0    0    0    0    0    0 ]
      [  0    1   -2    1    0    0    0    0    0    0 ]
      [  0    0    1   -2    1    0    0    0    0    0 ]
A  =  [  0    0    0    1   -2    1    0    0    0    0 ]
      [  0    0    0    0    1   -2    1    0    0    0 ]
      [  0    0    0    0    0    1   -2    1    0    0 ]
      [  0    0    0    0    0    0    1   -2    1    0 ]
      [  0    0    0    0    0    0    0    1   -2    1 ]
      [  0    0    0    0    0    0    0    0    1   -2 ]
Install
m install ndarray-band
API
require('ndarray-band')( A, offsets )

Create a view of a band of an ndarray given offsets along the dimensions.

Returns: a 1-D ndarray starting at element 0 and of whatever length required such that the view will never contain an element outside the original ndarray.

Credits

(c) 2015 Ricky Reusser. MIT License


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.