3 #ifndef VISR_EFL_BASIC_MATRIX_HPP_INCLUDED 4 #define VISR_EFL_BASIC_MATRIX_HPP_INCLUDED 8 #pragma warning(disable: 4996) 31 template<
typename ElementType >
32 class VISR_EFL_LIBRARY_SYMBOL BasicMatrix
38 , mNumberOfColumns( 0 )
39 , mData( alignmentElements )
43 explicit BasicMatrix( std::size_t numberOfRows, std::size_t numberOfColumns, std::size_t alignmentElements = 0 )
45 , mNumberOfRows( numberOfRows )
46 , mNumberOfColumns( numberOfColumns )
47 , mData( mStride*mNumberOfRows, alignmentElements )
52 explicit BasicMatrix( std::size_t numberOfRows, std::size_t numberOfColumns,
53 std::initializer_list< std::initializer_list< ElementType > >
const & initialValues,
54 std::size_t alignmentElements = 0 )
56 , mNumberOfRows( numberOfRows )
57 , mNumberOfColumns( numberOfColumns )
58 , mData( mStride*mNumberOfRows, alignmentElements )
60 if( initialValues.size() != numberOfRows )
62 throw std::invalid_argument(
"BasicMatrix constructor: The number of lists in the initializer list does not match the number of rows." );
64 std::size_t rowIdx( 0 );
65 for(
auto rowIt = initialValues.begin(); rowIt != initialValues.end(); ++rowIt, ++rowIdx )
67 std::initializer_list< ElementType >
const & colInitialiser = *rowIt;
68 if( colInitialiser.size() != numberOfColumns )
70 throw std::invalid_argument(
"BasicMatrix constructor: The number of elements for each list within the initializer list must match the number of columns." );
72 std::copy( colInitialiser.begin(), colInitialiser.end(), row( rowIdx ) );
89 void resize( std::size_t newNumberOfRows, std::size_t newNumberOfColumns )
92 std::size_t newStride =
nextAlignedSize( newNumberOfColumns, alignmentElements() );
97 throw std::runtime_error(
"Zeroing of matrix failed" );
101 mNumberOfRows = newNumberOfRows;
102 mNumberOfColumns = newNumberOfColumns;
103 mData.swap( newData );
111 throw std::runtime_error(
"Zeroing of matrix failed" );
120 throw std::runtime_error(
"Filling of matrix failed" );
135 throw std::logic_error(
"BasicMatrix::swap(): Matrix layout must be consistent for swapping" );
137 mData.swap( rhs.mData );
147 const std::size_t minAlignment = std::min( alignmentElements(), rhs.
alignmentElements() );
150 throw std::invalid_argument(
"BasicMatrix::copy(): Matrix size inconsistent." );
152 if( rhs.
stride() == stride() )
156 throw std::runtime_error(
"BasicMatrix::copy() failed: " );
161 for( std::size_t rowIdx( 0 ); rowIdx < numberOfRows(); ++rowIdx )
163 if(
vectorCopy( rhs.
row( rowIdx ), row( rowIdx ), numberOfColumns( ), minAlignment ) !=
noError )
165 throw std::runtime_error(
"BasicMatrix::copy() failed: " );
173 std::size_t
stride()
const {
return mStride; }
179 ElementType&
operator()( std::size_t rowIdx, std::size_t colIdx )
181 return mData[rowIdx * stride() + colIdx];
184 ElementType
const &
operator()( std::size_t rowIdx, std::size_t colIdx )
const 186 return mData[rowIdx * stride( ) + colIdx];
189 ElementType&
at( std::size_t rowIdx, std::size_t colIdx )
191 if( (rowIdx >= numberOfRows()) or( colIdx >= numberOfColumns()) )
193 throw std::out_of_range(
"Matrix indices exceed dimensions." );
195 return operator()( rowIdx, colIdx );
198 ElementType
const &
at( std::size_t rowIdx, std::size_t colIdx )
const 200 if( (rowIdx >= numberOfRows() ) or ( colIdx >= numberOfColumns()) )
202 throw std::out_of_range(
"Matrix indices exceed dimensions." );
204 return operator()( rowIdx, colIdx );
207 ElementType *
data( ) {
return mData.data( ); }
209 ElementType
const *
data()
const {
return mData.data(); }
211 ElementType *
row( std::size_t rowIdx ) {
return data() + rowIdx * stride(); }
213 ElementType
const *
row( std::size_t rowIdx )
const {
return data( ) + rowIdx * stride( ); }
215 void setRow( std::size_t rowIdx, ElementType
const * values )
220 void setColumn( std::size_t colIdx, ElementType
const * values )
223 for( std::size_t rowIdx( 0 ); rowIdx < numberOfRows(); ++rowIdx )
225 (*this)(rowIdx, colIdx) = values[rowIdx];
234 std::size_t mNumberOfRows;
235 std::size_t mNumberOfColumns;
243 #endif // #ifndef VISR_EFL_BASIC_MATRIX_HPP_INCLUDED ElementType * data()
Definition: aligned_array.hpp:108
ElementType * data()
Definition: basic_matrix.hpp:207
std::size_t alignmentElements() const
Definition: basic_matrix.hpp:171
void setColumn(std::size_t colIdx, ElementType const *values)
Definition: basic_matrix.hpp:220
std::size_t nextAlignedSize(std::size_t size, std::size_t alignment)
Definition: alignment.hpp:70
void copy(BasicMatrix< ElementType > const &rhs)
Definition: basic_matrix.hpp:145
ElementType const & operator()(std::size_t rowIdx, std::size_t colIdx) const
Definition: basic_matrix.hpp:184
Definition: error_codes.hpp:15
ErrorCode vectorZero(T *const dest, std::size_t numElements, std::size_t alignment)
Definition: vector_functions.cpp:40
BasicMatrix(std::size_t numberOfRows, std::size_t numberOfColumns, std::initializer_list< std::initializer_list< ElementType > > const &initialValues, std::size_t alignmentElements=0)
Definition: basic_matrix.hpp:52
void fillValue(ElementType val)
Definition: basic_matrix.hpp:115
Definition: options.cpp:10
BasicMatrix(std::size_t alignmentElements=0)
Definition: basic_matrix.hpp:35
ElementType const & at(std::size_t rowIdx, std::size_t colIdx) const
Definition: basic_matrix.hpp:198
~BasicMatrix()
Definition: basic_matrix.hpp:80
void resize(std::size_t newNumberOfRows, std::size_t newNumberOfColumns)
Definition: basic_matrix.hpp:89
ErrorCode vectorFill(const T value, T *const dest, std::size_t numElements, std::size_t alignment)
Definition: vector_functions.cpp:51
ErrorCode vectorCopy(T const *const source, T *const dest, std::size_t numElements, std::size_t alignment)
Definition: vector_functions.cpp:73
BasicMatrix(std::size_t numberOfRows, std::size_t numberOfColumns, std::size_t alignmentElements=0)
Definition: basic_matrix.hpp:43
std::size_t numberOfColumns() const
Definition: basic_matrix.hpp:177
ElementType const * row(std::size_t rowIdx) const
Definition: basic_matrix.hpp:213
ElementType & operator()(std::size_t rowIdx, std::size_t colIdx)
Definition: basic_matrix.hpp:179
ElementType const * data() const
Definition: basic_matrix.hpp:209
void zeroFill()
Definition: basic_matrix.hpp:106
ElementType * row(std::size_t rowIdx)
Definition: basic_matrix.hpp:211
std::size_t numberOfRows() const
Definition: basic_matrix.hpp:175
ErrorCode
Definition: error_codes.hpp:13
ElementType & at(std::size_t rowIdx, std::size_t colIdx)
Definition: basic_matrix.hpp:189
std::size_t stride() const
Definition: basic_matrix.hpp:173
Definition: aligned_array.hpp:33
void setRow(std::size_t rowIdx, ElementType const *values)
Definition: basic_matrix.hpp:215
Definition: init_filter_matrix.hpp:15
void swap(BasicMatrix< ElementType > &rhs)
Definition: basic_matrix.hpp:130