![]() |
Reference to a specific column of a dense or sparse matrix.The Column template represents a reference to a specific column of a dense or sparse matrix primitive. The type of the matrix is specified via the first template parameter: More...
#include <BaseTemplate.h>
Reference to a specific column of a dense or sparse matrix.
The Column template represents a reference to a specific column of a dense or sparse matrix primitive. The type of the matrix is specified via the first template parameter:
A reference to a dense or sparse column can be created very conveniently via the column()
function. This reference can be treated as any other column vector, i.e. it can be assigned to, it can be copied from, and it can be used in arithmetic operations. The reference can also be used on both sides of an assignment: The column can either be used as an alias to grant write access to a specific column of a matrix primitive on the left-hand side of an assignment or to grant read-access to a specific column of a matrix primitive or expression on the right-hand side of an assignment. The following example demonstrates this in detail:
The column()
function can be used on any dense or sparse matrix, including expressions, as illustrated by the source code example. However, columns cannot be instantiated for expression types, but only for matrix primitives, respectively, i.e. for matrix types that offer write access.
A dense or sparse column can be used like any other column vector. For instance, the elements of the dense column can be directly accessed with the subscript operator.
The numbering of the column elements is
where N is the number of rows of the referenced matrix. Alternatively, the elements of a column can be traversed via iterators. Just as with vectors, in case of non-const rows, begin()
and end()
return an Iterator, which allows a manipulation of the non-zero values, in case of constant columns a ConstIterator is returned:
Inserting/accessing elements in a sparse column can be done by several alternative functions. The following example demonstrates all options:
The current number of column 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 columns are references to specific columns of a matrix, several operations are not possible on views, such as resizing and swapping:
Both dense and sparse columns can be used in all arithmetic operations that any other dense or sparse column vector can be used in. The following example gives an impression of the use of dense columns within arithmetic operations. All operations (addition, subtraction, multiplication, scaling, ...) can be performed on all possible combinations of dense and sparse columns with fitting element types:
It is especially noteworthy that column views can be created for both row-major and column-major matrices. Whereas the interface of a row-major matrix only allows to traverse a row directly and the interface of a column-major matrix only allows to traverse a column, via views it is also possible to traverse a column of a row-major matrix. For instance:
However, please note that creating a column view on a matrix stored in a row-major fashion can result in a considerable performance decrease in comparison to a column view on a matrix with column-major storage format. This is due to the non-contiguous storage of the matrix elements. Therefore care has to be taken in the choice of the most suitable storage order:
Although Blaze performs the resulting matrix/vector multiplication as efficiently as possible using a column-major storage order for matrix A would result in a more efficient evaluation.