![]() |
Bands provide views on a specific band of a dense or sparse matrix (e.g. the diagonal, the subdiagonal, ...). As such, bands act as a reference to a specific band. This reference is valid and can be used in every way any other vector can be used as long as the matrix containing the band is not resized or entirely destroyed. The band also acts as an alias to the band elements: Changes made to the elements (e.g. modifying values, inserting or erasing elements) are immediately visible in the matrix and changes made via the matrix are immediately visible in the band.
A reference to a dense or sparse band can be created very conveniently via the band()
function. It can be included via the header file
The band index must be in the range from , where
M
is the total number of rows and N
is the total number of columns, and can be specified both at compile time or at runtime:
In addition, the diagonal()
function provides a convenient shortcut for the setup of a view on the diagonal of a dense or sparse matrix. It has the same effect as calling the band()
function with a compile time index of 0:
Both the band()
and the diagonal()
function return an expression representing the band view. The type of this expression depends on the given arguments, primarily the type of the matrix and the compile time arguments. If the type is required, it can be determined via decltype
or via the BandExprTrait
and DiagonalExprTrait
class templates, respectively:
This resulting view can be treated as any other vector, i.e. it can be assigned to, it can be copied from, and it can be used in arithmetic operations. By default, bands are considered column vectors, but this setting can be changed via the defaultTransposeFlag
switch. The reference can also be used on both sides of an assignment: The band can either be used as an alias to grant write access to a specific band of a matrix primitive on the left-hand side of an assignment or to grant read-access to a specific band of a matrix primitive or expression on the right-hand side of an assignment. The following example demonstrates this in detail:
The elements of a band can be directly accessed with the subscript operator:
The numbering of the band elements is
where N is the number of elements of the referenced band. Alternatively, the elements of a band can be traversed via iterators. Just as with vectors, in case of non-const band, begin()
and end()
return an iterator, which allows to manipulate the elements, in case of constant bands an iterator to immutable elements is returned:
Inserting/accessing elements in a sparse band can be done by several alternative functions. The following example demonstrates all options:
A band view can be used like any other column vector. This means that with only a few exceptions all Vector Operations and Arithmetic Operations can be used. For instance, the current number of band elements can be obtained via the size()
function, the current capacity via the capacity()
function, and the number of non-zero elements via the nonZeros()
function. However, since bands are references to specific bands of a matrix, several operations are not possible, such as resizing and swapping. The following example shows this by means of a dense band view:
Both dense and sparse bands can be used in all arithmetic operations that any other dense or sparse vector can be used in. The following example gives an impression of the use of dense bands within arithmetic operations. All operations (addition, subtraction, multiplication, scaling, ...) can be performed on all possible combinations of dense and sparse bands with fitting element types:
Previous: Column Selections Next: Arithmetic Operations