28 #ifndef SHARK_LINALG_BLAS_MATRIX_HPP 29 #define SHARK_LINALG_BLAS_MATRIX_HPP 35 #include <boost/serialization/collection_size_type.hpp> 36 #include <boost/serialization/array.hpp> 37 #include <boost/serialization/nvp.hpp> 38 #include <boost/serialization/vector.hpp> 55 template<
class T,
class L=row_major>
58 typedef std::vector<T> array_type;
60 typedef typename array_type::size_type size_type;
61 typedef typename array_type::difference_type difference_type;
62 typedef typename array_type::value_type value_type;
63 typedef value_type scalar_type;
69 typedef std::size_t index_type;
89 :m_size1(size1), m_size2(size2), m_data(size1 * size2) {}
97 m_size1(size1), m_size2(size2), m_data(size1 * size2, init) {}
105 m_size1(size1), m_size2(size2), m_data(data) {}
111 m_size1(m.m_size1), m_size2(m.m_size2), m_data(m.m_data) {}
118 m_size1(e().
size1()), m_size2(e().
size2()), m_data(m_size1 * m_size2) {
137 return orientation::stride1(m_size1,m_size2);
141 return orientation::stride2(m_size1,m_size2);
170 m_data.resize(size1* size2);
176 std::fill(m_data.begin(), m_data.end(), value_type());
180 const_reference
operator()(index_type i, index_type j)
const {
181 return m_data [orientation::element(i, m_size1, j, m_size2)];
184 return m_data [orientation::element(i, m_size1, j, m_size2)];
188 m_data [orientation::element(i, m_size1, j, m_size2)] = t;
205 self_type temporary(e);
214 m_data.swap(m.m_data);
224 for(std::size_t k = 0; k != a.
size2(); ++k){
239 for(std::size_t k = 0; k != a.
size1(); ++k){
258 const_row_iterator
row_end(index_type i)
const {
284 major_iterator
set_element(major_iterator pos, index_type index, value_type value) {
291 *elem = value_type();
295 major_iterator
clear_range(major_iterator start, major_iterator end) {
296 std::fill(start,end,value_type());
305 template<
class Archive>
310 boost::serialization::collection_size_type s1(m_size1);
311 boost::serialization::collection_size_type s2(m_size2);
314 ar& boost::serialization::make_nvp(
"size1",s1)
315 & boost::serialization::make_nvp(
"size2",s2);
318 if (Archive::is_loading::value) {
322 ar& boost::serialization::make_nvp(
"data",m_data);
330 template<
class T,
class L>
331 struct matrix_temporary_type<T,L,dense_random_access_iterator_tag>{
336 struct matrix_temporary_type<T,unknown_orientation,dense_random_access_iterator_tag>{
344 template<
class VectorType>
348 typedef std::size_t size_type;
349 typedef std::ptrdiff_t difference_type;
350 typedef typename VectorType::value_type value_type;
351 typedef typename VectorType::scalar_type scalar_type;
357 typedef std::size_t index_type;
373 return m_diagonal.size();
376 return m_diagonal.size();
380 const_reference
operator()(index_type i, index_type j)
const {
382 return m_diagonal(i);
394 m_diagonal = m.m_diagonal;
400 swap(m_diagonal,m.m_diagonal);
410 typedef typename diagonal_matrix::value_type value_type;
411 typedef typename diagonal_matrix::difference_type difference_type;
418 :m_index(index),m_value(value),m_isEnd(isEnd){}
442 m_index = it.m_index;
449 return m_isEnd == it.m_isEnd;
476 value_type
const m_zero;
481 template<
class T,
class Orientation>
482 struct const_expression<
matrix<T,Orientation> >{
485 template<
class T,
class Orientation>
486 struct const_expression<
matrix<T,Orientation> const>{