bind2vind
Convert a linear index in an underlying data buffer to a linear index in an array view.
Usage
var bind2vind = require( '@stdlib/ndarray/base/bind2vind' );
bind2vind( shape, strides, offset, order, idx, mode )
Converts a linear index in an underlying data buffer to a linear index in an array view.
var shape = [ 3, 3 ];
var order = 'row-major';
var strides = [ -3, 1 ];
var offset = 6;
var idx = bind2vind( shape, strides, offset, order, 7, 'throw' );
// returns 1
The function supports the following modes:
- throw: specifies that the function should throw an error when a linear index exceeds array dimensions.
- normalize: specifies that the function should normalize negative indices and should throw an error when a linear index exceeds array dimensions.
- wrap: specifies that the function should wrap around a linear index exceeding array dimensions using modulo arithmetic.
- clamp: specifies that the function should set a linear index exceeding array dimensions to either
0
(minimum linear index) or the maximum linear index.
var shape = [ 2, 2 ];
var order = 'row-major';
var strides = [ -2, 1 ];
var offset = 2;
var idx = bind2vind( shape, strides, offset, order, -2, 'wrap' );
// returns 0
idx = bind2vind( shape, strides, offset, order, 10, 'clamp' );
// returns 1
The order
parameter specifies whether an array is row-major
(C-style) or column-major
(Fortran-style).
var shape = [ 2, 2 ];
var order = 'column-major';
var strides = [ 1, -2 ];
var offset = 2;
var idx = bind2vind( shape, strides, offset, order, 2, 'throw' );
// returns 0
Examples
var shape2strides = require( '@stdlib/ndarray/base/shape2strides' );
var strides2offset = require( '@stdlib/ndarray/base/strides2offset' );
var numel = require( '@stdlib/ndarray/base/numel' );
var randu = require( '@stdlib/random/base/randu' );
var bind2vind = require( '@stdlib/ndarray/base/bind2vind' );
// Specify array meta data:
var shape = [ 3, 3, 3 ];
var order = 'row-major';
// Compute array meta data:
var len = numel( shape );
var strides = shape2strides( shape, order );
// Randomly flip the sign of strides...
var i;
for ( i = 0; i < shape.length; i++ ) {
if ( randu() < 0.5 ) {
strides[ i ] *= -1;
}
}
// Compute the underlying data buffer index offset:
var offset = strides2offset( shape, strides );
// Print array info:
console.log( 'Dims: %s', shape.join( 'x' ) );
console.log( 'Strides: %s', strides.join( ',' ) );
console.log( 'Offset: %d', offset );
// For each underlying data buffer index, determine the corresponding index into an array view...
var ind;
for ( i = 0; i < len; i++ ) {
ind = bind2vind( shape, strides, offset, order, i, 'throw' );
console.log( 'buffer[%d] => view[%d]', i, ind );
}