All files main.js

100% Statements 88/88
100% Branches 2/2
100% Functions 1/1
100% Lines 88/88

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 891x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 1x 1x 1x 1x 1x  
/**
* @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 broadcast = require( '@stdlib/ndarray/base/broadcast-array' );
var diagonal = require( '@stdlib/ndarray/base/diagonal' );
var getShape = require( '@stdlib/ndarray/base/shape' );
var assign = require( '@stdlib/ndarray/base/assign' );
 
 
// MAIN //
 
/**
* Assigns elements from a broadcasted input ndarray to a specified diagonal of an output ndarray.
*
* ## Notes
*
* -   The order of the dimension indices contained in `dims` matters. The first element specifies the row-like dimension. The second element specifies the column-like dimension.
* -   Each provided dimension index must reside on the interval `[-ndims, ndims-1]`.
* -   The diagonal offset `k` is interpreted as `column - row`. Accordingly, when `k = 0`, the function assigns to the main diagonal; when `k > 0`, the function assigns to a diagonal above the main diagonal; and when `k < 0`, the function assigns to a diagonal below the main diagonal.
* -   The input ndarray must be broadcast compatible with the output ndarray view defined by the specified diagonal.
* -   The function mutates the output ndarray in-place.
*
* @param {ArrayLikeObject<ndarray>} arrays - array-like object containing one input array and one output array
* @param {IntegerArray} dims - dimension indices defining the plane in which to assign elements to the diagonal
* @param {integer} k - diagonal offset
* @throws {RangeError} must provide exactly two dimension indices
* @throws {RangeError} output ndarray must have at least two dimensions
* @throws {RangeError} must provide valid dimension indices
* @throws {Error} must provide unique dimension indices
* @throws {Error} input ndarray must be broadcast compatible with the output ndarray diagonal view
* @returns {ndarray} output ndarray
*
* @example
* var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
* var zeros = require( '@stdlib/ndarray/zeros' );
*
* var x = scalar2ndarray( 1.0 );
* // returns <ndarray>
*
* var y = zeros( [ 3, 3 ] );
* // returns <ndarray>[ [ 0.0, 0.0, 0.0 ], [ 0.0, 0.0, 0.0 ], [ 0.0, 0.0, 0.0 ] ]
*
* var out = assignDiagonal( [ x, y ], [ 0, 1 ], 0 );
* // returns <ndarray>[ [ 1.0, 0.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 0.0, 0.0, 1.0 ] ]
*
* var bool = ( out === y );
* // returns true
*/
function assignDiagonal( arrays, dims, k ) {
	var view;
	var x;
 
	// Resolve a writable output array view of the specified diagonal:
	view = diagonal( arrays[ 1 ], dims, k, true );
 
	// Broadcast the input array to the diagonal view shape:
	x = broadcast( arrays[ 0 ], getShape( view, true ) );
 
	// Assign elements from the broadcasted input array to the output array view:
	assign( [ x, view ] );
 
	// Return the original output ndarray:
	return arrays[ 1 ];
}
 
 
// EXPORTS //
 
module.exports = assignDiagonal;