Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 48x 48x 48x 48x 48x 48x 48x 48x 48x 120x 120x 120x 48x 48x 84x 84x 84x 48x 48x 36x 36x 48x 48x 48x 48x 48x 12x 12x 12x 3x 3x 3x 3x 3x | /**
* @license Apache-2.0
*
* Copyright (c) 2026 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
// MODULES //
var abs = require( '@stdlib/math/base/special/abs' );
var max = require( '@stdlib/math/base/special/max' );
var min = require( '@stdlib/math/base/special/min' );
// MAIN //
/**
* Computes the reciprocal pivot growth factor norm(A)/norm(U) for a general banded matrix `A`.
*
* ## Notes
*
* - The norm is used. If this is much less than 1, the stability of the LU factorization of the (equilibrated) matrix `A` could be poor. This also means that the solution `X`, estimated condition numbers, and error bounds could be unreliable.
* - Matrix `AB` is the matrix A in band storage, in rows 0 to `KL+KU`. The j-th column of A is stored in the j-th column of the matrix `AB` as `AB( KU+i-j, j ) = A( i, j )` for `max( 0, j - KU ) <= i <= min( N - 1, j + KL )`.
* - Matrix `AFB` stores the details of the LU factorization of the band matrix `A`, as computed by `DGBTRF`. `U` is stored as an upper triangular band matrix with KL+KU superdiagonals in rows 0 to `KL+KU+1`, and the multipliers used during the factorization are stored in rows `KL+KU+1` to `2*KL+KU`.
* - The leading dimension of `AB`, `LDAB` >= `KL+KU+1`.
* - The leading dimension of `AFB`, `LDAFB` >= `2*KL+KU+1`.
*
* @private
* @param {NonNegativeInteger} N - number of rows in matrix `A`
* @param {NonNegativeInteger} KL - number of subdiagonals within the band of matrix `A`
* @param {NonNegativeInteger} KU - number of superdiagonals within the band of matrix `A`
* @param {NonNegativeInteger} NCOLS - number of columns in matrix `A`
* @param {Float64Array} AB - the matrix A in band storage
* @param {integer} strideAB1 - stride of the first dimension of `AB`
* @param {integer} strideAB2 - stride of the second dimension of `AB`
* @param {NonNegativeInteger} offsetAB - index offset for `AB`
* @param {Float64Array} AFB - details of the LU factorization of the band matrix `A`
* @param {integer} strideAFB1 - stride of the first dimension of `AFB`
* @param {integer} strideAFB2 - stride of the second dimension of `AFB`
* @param {NonNegativeInteger} offsetAFB - index offset for `AFB`
* @returns {number} the reciprocal pivot growth factor
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
*
* var AB = new Float64Array( [ 0.0, 2.0, 5.0, 8.0, 1.0, 4.0, 7.0, 10.0, 3.0, 6.0, 9.0, 0.0 ] );
* var AFB = new Float64Array( [ 0.0, 0.0, 5.0, 8.0, 0.0, 4.0, 7.0, 10.0, 3.0, 6.0, 9.0, 1.8272, 0.3333, 0.1111, -0.2716, 0.0 ] );
*
* var out = dlagbrpvgrw( 4, 1, 1, 4, AB, 4, 1, 0, AFB, 4, 1, 0 );
* // returns 1.0
*/
function dlagbrpvgrw( N, KL, KU, NCOLS, AB, strideAB1, strideAB2, offsetAB, AFB, strideAFB1, strideAFB2, offsetAFB ) { // eslint-disable-line max-params, max-len
var rowEndAB;
var rowStart;
var rpvgrw;
var amax;
var iafb;
var umax;
var iab;
var kd;
var i;
var j;
rpvgrw = 1.0;
kd = KU + 1;
iab = offsetAB;
iafb = offsetAFB;
for ( j = 0; j < NCOLS; j++ ) {
amax = 0.0;
umax = 0.0;
rowStart = max( j - KU, 0 ); // Starting index for row
rowEndAB = min( j + KL + 1, N ); // Ending index for row in AB
iab += ( kd + rowStart - j - 1 )*strideAB1;
iafb += ( kd + rowStart - j - 1 )*strideAFB1;
for ( i = rowStart; i < rowEndAB; i++ ) {
amax = max( abs( AB[ iab ] ), amax );
iab += strideAB1;
}
for ( i = rowStart; i <= j; i++ ) {
umax = max( abs( AFB[ iafb ] ), umax );
iafb += strideAFB1;
}
if ( umax !== 0.0 ) {
rpvgrw = min( amax / umax, rpvgrw );
}
// Shift the index for both matrices to the beginning of the next column
iab += strideAB2 - ( ( kd + rowEndAB - j - 1 )*strideAB1 );
iafb += strideAFB2 - ( kd*strideAFB1 );
}
return rpvgrw;
}
// EXPORTS //
module.exports = dlagbrpvgrw;
|