Apply a real elementary reflector
H = I - tau * v * v^Tto a real M by N matrixC.
A Householder transformation (or an elementary reflector) is a linear transformation that describes a reflection about a plane or a hyperplane containing the origin.
var dlarf1f = require( '@stdlib/lapack/base/dlarf1f' );Applies a real elementary reflector H = I - tau * v * v^T to a real M by N matrix C.
var Float64Array = require( '@stdlib/array/float64' );
var C = new Float64Array( [ 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
var V = new Float64Array( [ 0.5, 0.5, 0.5, 0.5 ] );
var work = new Float64Array( 3 );
var out = dlarf1f( 'row-major', 'left', 4, 3, V, 1, 1.0, C, 3, work );
// returns <Float64Array>[ -4.5, -10.5, -16.5, -0.75, -1.75, -2.75, 0.25, -0.75, -1.75, 1.25, 0.25, -0.75 ]The function has the following parameters:
- order: storage layout.
- side: specifies the side of multiplication with
C. - M: number of rows in
C. - N: number of columns in
C. - V: the vector
vas aFloat64Array. - strideV: stride length for
V. IfstrideVis negative, the elements ofVare accessed in reverse order. - tau: scalar constant.
- C: input matrix stored in linear memory as a
Float64Array. - LDC: stride of the first dimension of
C(a.k.a., leading dimension of the matrixC). - work: workspace
Float64Array.
When side is 'left',
workshould haveNindexed elements.Vshould have1 + (M-1) * abs(strideV)indexed elements.Cis overwritten byH * C.
When side is 'right',
workshould haveMindexed elements.Vshould have1 + (N-1) * abs(strideV)indexed elements.Cis overwritten byC * H.
The sign of the increment parameter strideV determines the order in which elements of V are accessed. For example, to access elements in reverse order,
var Float64Array = require( '@stdlib/array/float64' );
var C = new Float64Array( [ 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
var V = new Float64Array( [ 0.5, 0.4, 0.3, 0.2 ] );
var work = new Float64Array( 3 );
var out = dlarf1f( 'row-major', 'left', 4, 3, V, -1, 1.0, C, 3, work );
// returns <Float64Array>[ ~-3.80, -8.6, ~-13.4, ~0.56, 1.92, ~3.28, ~1.08, ~1.56, ~2.04, ~1.60, ~1.20, ~0.80 ]To perform strided access over V, provide an abs(strideV) value greater than one. For example, to access every other element in V,
var Float64Array = require( '@stdlib/array/float64' );
var C = new Float64Array( [ 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
var V = new Float64Array( [ 0.5, 999, 0.5, 999, 0.5, 999, 0.5 ] );
var work = new Float64Array( 3 );
var out = dlarf1f( 'row-major', 'left', 4, 3, V, 2, 1.0, C, 3, work );
// returns <Float64Array>[ -4.5, -10.5, -16.5, -0.75, -1.75, -2.75, 0.25, -0.75, -1.75, 1.25, 0.25, -0.75 ]Note that indexing is relative to the first index. To introduce an offset, use typed array views.
var Float64Array = require( '@stdlib/array/float64' );
// Initial arrays...
var C0 = new Float64Array( [ 0.0, 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
var V0 = new Float64Array( [ 0.0, 0.5, 0.5, 0.5, 0.5 ] );
var work0 = new Float64Array( [ 0.0, 0.0, 0.0, 0.0 ] );
// Create offset views...
var C1 = new Float64Array( C0.buffer, C0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var V1 = new Float64Array( V0.buffer, V0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var work1 = new Float64Array( work0.buffer, work0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var our = dlarf1f( 'row-major', 'left', 4, 3, V1, 1, 1.0, C1, 3, work1 );
// C0 => <Float64Array>[ 0.0, -4.5, -10.5, -16.5, -0.75, -1.75, -2.75, 0.25, -0.75, -1.75, 1.25, 0.25, -0.75 ]Applies a real elementary reflector H = I - tau * v * v^T to a real M by N matrix C using alternative indexing semantics.
var Float64Array = require( '@stdlib/array/float64' );
var C = new Float64Array( [ 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
var V = new Float64Array( [ 0.5, 0.5, 0.5, 0.5 ] );
var work = new Float64Array( 3 );
var out = dlarf1f.ndarray( 'left', 4, 3, V, 1, 0, 1.0, C, 3, 1, 0, work, 1, 0 );
// returns <Float64Array>[ -4.5, -10.5, -16.5, -0.75, -1.75, -2.75, 0.25, -0.75, -1.75, 1.25, 0.25, -0.75 ]The function has the following additional parameters:
- side: specifies the side of multiplication with
C. - M: number of rows in
C. - N: number of columns in
C. - V: the vector
vas aFloat64Array. - sv: stride length for
V. - ov: starting index for
V. - tau: scalar constant.
- C: input matrix as a
Float64Array. - sc1: stride of the first dimension of
C. - sc2: stride of the second dimension of
C. - oc: starting index for
C. - work: workspace array as a
Float64Array. - sw: stride length for
work. - ow: starting index for
work.
When side is 'left',
workshould haveNindexed elements.Vshould have1 + (M-1) * abs(sv)indexed elements.Cis overwritten byH * C.
When side is 'right',
workshould haveMindexed elements.Vshould have1 + (N-1) * abs(sv)indexed elements.Cis overwritten byC * H.
While typed array views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example,
var Float64Array = require( '@stdlib/array/float64' );
var C = new Float64Array( [ 0.0, 0.0, 0.0, 0.0, 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
var V = new Float64Array( [ 0.0, 0.0, 0.5, 0.5, 0.5, 0.5 ] );
var work = new Float64Array( [ 0.0, 0.0, 0.0, 0.0 ] );
var out = dlarf1f.ndarray( 'left', 4, 3, V, 1, 2, 1.0, C, 3, 1, 4, work, 1, 0 );
// C => <Float64Array>[ 0.0, 0.0, 0.0, 0.0, -4.5, -10.5, -16.5, -0.75, -1.75, -2.75, 0.25, -0.75, -1.75, 1.25, 0.25, -0.75 ]var Float64Array = require( '@stdlib/array/float64' );
var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
var shape2strides = require( '@stdlib/ndarray/base/shape2strides' );
var dlarf1f = require( '@stdlib/lapack/base/dlarf1f' );
// Specify matrix meta data:
var shape = [ 4, 3 ];
var order = 'row-major';
var strides = shape2strides( shape, order );
// Create a matrix stored in linear memory:
var C = new Float64Array( [ 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0 ] );
console.log( ndarray2array( C, shape, strides, 0, order ) );
// Define the vector `v` and a workspace array:
var V = new Float64Array( [ 0.5, 0.5, 0.5, 0.5 ] );
var work = new Float64Array( 3 );
// Apply the elementary reflector:
dlarf1f( order, 'left', shape[ 0 ], shape[ 1 ], V, 1, 1.0, C, strides[ 0 ], work );
console.log( ndarray2array( C, shape, strides, 0, order ) );TODOTODO.
TODOTODO
TODOTODO