vind2bind
Convert a linear index in an array view to a linear index in an underlying data buffer.
Usage
var vind2bind = require( '@stdlib/ndarray/base/vind2bind' );
vind2bind( shape, strides, offset, order, idx, mode )
Converts a linear index in an array view to a linear index in an underlying data buffer.
var shape = [ 3, 3 ];
var order = 'row-major';
var strides = [ -3, 1 ];
var offset = 6;
var idx = vind2bind( shape, strides, offset, order, 1, 'throw' );
// returns 7
The function supports the following modes
:
throw
: specifies that the function 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 either0
(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 = vind2bind( shape, strides, offset, order, -2, 'wrap' );
// returns 0
idx = vind2bind( 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 = vind2bind( 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 vind2bind = require( '@stdlib/ndarray/base/vind2bind' );
// 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 view index, determine the corresponding index into an array's underlying data buffer...
var ind;
for ( i = 0; i < len; i++ ) {
ind = vind2bind( shape, strides, offset, order, i, 'throw' );
console.log( 'view[%d] => buffer[%d]', i, ind );
}