22#ifndef var_general_matrix_h
23#define var_general_matrix_h
44 static constexpr bool isVector {
false};
45 using value_type = AT;
75 explicit Matrix(
int m,
int n,
Noinit) : M(m), N(n), ele(new AT[M*N]) { }
76 explicit Matrix(
int m,
int n, Init ini=INIT,
const AT &a=AT()) : M(m), N(n), ele(new AT[M*N]) { init(a); }
77 explicit Matrix(
int m,
int n, Eye ini,
const AT &a=1) : M(m), N(n), ele(new AT[M*N]) { init(ini,a); }
80 Matrix(Matrix<General,Var,Var,AT> &&src)
noexcept {
88 Matrix<General,Var,Var,AT>& operator=(Matrix<General,Var,Var,AT> &&src)
noexcept {
89 FMATVEC_ASSERT(M == src.rows(), AT);
90 FMATVEC_ASSERT(N == src.cols(), AT);
113 template<
class Row,
class Col>
123 template<
class Type,
class Row,
class Col>
140 Matrix(
const std::string &strs);
149 using iterator = AT *;
150 using const_iterator =
const AT *;
151 iterator begin() {
return &ele[0]; }
152 iterator end() {
return &ele[M*N]; }
153 const_iterator begin()
const {
return &ele[0]; }
154 const_iterator end()
const {
return &ele[M*N]; }
156 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Noinit) {
164 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Init ini=INIT,
const AT &a=AT()) {
return resize(m,n,Noinit()).init(a); }
166 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Eye ini,
const AT &a=1) {
return resize(m,n,Noinit()).init(ini,a); }
175 FMATVEC_ASSERT(M == A.
rows(), AT);
176 FMATVEC_ASSERT(N == A.
cols(), AT);
186 template <
class Type,
class Row,
class Col>
188 FMATVEC_ASSERT(M == A.
rows(), AT);
189 FMATVEC_ASSERT(N == A.
cols(), AT);
199 template<
class Type,
class Row,
class Col>
205 inline Matrix<General,Var,Var,AT>& operator<<=(Matrix<General,Var,Var,AT> &&src) {
217 operator Matrix<General,Var,Var,AT2>()
const {
218 Matrix<General,Var,Var,AT2> ret(
rows(),
cols());
219 for(
size_t r=0; r<
rows(); ++r)
220 for(
size_t c=0; c<
cols(); ++c)
221 ret(r,c) = (*this)(r,c);
235 FMATVEC_ASSERT(i>=0, AT);
236 FMATVEC_ASSERT(j>=0, AT);
237 FMATVEC_ASSERT(i<M, AT);
238 FMATVEC_ASSERT(j<N, AT);
248 FMATVEC_ASSERT(i>=0, AT);
249 FMATVEC_ASSERT(j>=0, AT);
250 FMATVEC_ASSERT(i<M, AT);
251 FMATVEC_ASSERT(j<N, AT);
256 AT& e(
int i,
int j) {
264 const AT&
e(
int i,
int j)
const {
276 const AT&
e(
int i)
const {
297 constexpr int rows()
const {
return M;}
303 constexpr int cols()
const {
return N;}
329 return CblasRowMajor;
338 template <
int M1,
int M2,
int N1,
int N2>
341 template <
int M1,
int M2>
344 template <
int N1,
int N2>
359 inline Matrix<General,Var,Var,AT>& init(Eye eye,
const AT &val=1);
360 inline Matrix<General,Var,Var,AT>& init(Noinit,
const AT &a=AT()) {
return *
this; }
366 explicit inline operator std::vector<std::vector<AT>>()
const;
373 explicit inline Matrix(
const std::vector<std::vector<AT>> &m);
391 inline const Matrix<General,Var,Var,AT> T()
const;
393 template<
class Row>
inline void set(
int j,
const Vector<Row,AT> &x);
395 template<
class Col>
inline void set(
int i,
const RowVector<Col,AT> &x);
397 template<
class Type,
class Row,
class Col>
inline void set(
const Range<Var,Var> &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A);
399 template<
class Row>
inline void add(
int j,
const Vector<Row,AT> &x);
401 template<
class Col>
inline void add(
int i,
const RowVector<Col,AT> &x);
403 template<
class Type,
class Row,
class Col>
inline void add(
const Range<Var,Var> &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A);
405 inline const Matrix<General,Var,Var,AT>
operator()(
const Indices &I,
const Indices &J)
const;
407 inline const Matrix<General,Var,Var,AT>
operator()(
const Range<Var,Var> &I,
const Indices &J)
const;
409 inline const Matrix<General,Var,Var,AT>
operator()(
const Indices &I,
const Range<Var,Var> &J)
const;
411 template<
class Row>
inline void set(
const Indices &I,
int j,
const Vector<Row,AT> &x);
413 template<
class Type,
class Row,
class Col>
inline void set(
const Indices &I,
const Indices &J,
const Matrix<Type,Row,Col,AT> &A);
415 template<
class Type,
class Row,
class Col>
inline void set(
const Range<Var,Var> &I,
const Indices &J,
const Matrix<Type,Row,Col,AT> &A);
417 template<
class Type,
class Row,
class Col>
inline void set(
const Indices &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A);
422 std::istringstream iss(strs);
428 throw std::runtime_error(
"Input not fully read.");
436 #pragma GCC diagnostic push
437 #pragma GCC diagnostic ignored "-Warray-bounds"
438 #pragma GCC diagnostic ignored "-Wstringop-overflow"
440 for(
int i=0; i<M*N; i++)
443 #pragma GCC diagnostic pop
450 for(
int i=0; i<M; i++)
451 for(
int j=0; j<N; j++)
452 e(i,j) = (i==j) ? val : 0;
458 FMATVEC_ASSERT(I.
end()<M, AT);
459 FMATVEC_ASSERT(J.
end()<N, AT);
462 for(
int i=0; i<A.
rows(); i++)
463 for(
int j=0; j<A.
cols(); j++)
469 template <
class AT>
template <
int M1,
int M2,
int N1,
int N2>
471 FMATVEC_ASSERT(M2<M, AT);
472 FMATVEC_ASSERT(N2<N, AT);
475 for(
int i=0; i<A.
rows(); i++)
476 for(
int j=0; j<A.
cols(); j++)
477 A.e(i,j) = e(I.start()+i,J.start()+j);
482 template <
class AT>
template <
int M1,
int M2>
484 FMATVEC_ASSERT(M2<M, AT);
485 FMATVEC_ASSERT(J.end()<N, AT);
486 Matrix<General,Fixed<M2-M1+1>,Var,AT> A(J.size(),NONINIT);
488 for(
int i=0; i<A.
rows(); i++)
489 for(
int j=0; j<A.
cols(); j++)
490 A.e(i,j) = e(I.start()+i,J.start()+j);
495 template <
class AT>
template <
int N1,
int N2>
497 FMATVEC_ASSERT(I.end()<M, AT);
498 FMATVEC_ASSERT(N2<N, AT);
499 Matrix<General,Var,Fixed<N2-N1+1>,AT> A(I.size(),NONINIT);
501 for(
int i=0; i<A.
rows(); i++)
502 for(
int j=0; j<A.
cols(); j++)
503 A.e(i,j) = e(I.start()+i,J.start()+j);
509 inline const RowVector<Var,AT> Matrix<General,Var,Var,AT>::row(
int i)
const {
511 FMATVEC_ASSERT(i>=0, AT);
512 FMATVEC_ASSERT(i<M, AT);
514 RowVector<Var,AT> x(N,NONINIT);
516 for(
int j=0; j<N; j++)
523 inline const Vector<Var,AT> Matrix<General,Var,Var,AT>::col(
int j)
const {
525 FMATVEC_ASSERT(j>=0, AT);
526 FMATVEC_ASSERT(j<N, AT);
528 Vector<Var,AT> x(M,NONINIT);
530 for(
int i=0; i<M; i++)
537 inline const Matrix<General,Var,Var,AT> Matrix<General,Var,Var,AT>::T()
const {
538 Matrix<General,Var,Var,AT> A(N,M,NONINIT);
539 for(
int i=0; i<N; i++)
540 for(
int j=0; j<M; j++)
545 template <
class AT>
template <
class Row>
546 inline void Matrix<General,Var,Var,AT>::set(
int j,
const Vector<Row,AT> &x) {
547 FMATVEC_ASSERT(j<
cols(), AT);
548 FMATVEC_ASSERT(
rows()==x.size(), AT);
549 for(
int i=0; i<
rows(); i++)
553 template <
class AT>
template <
class Col>
554 inline void Matrix<General,Var,Var,AT>::set(
int i,
const RowVector<Col,AT> &x) {
555 FMATVEC_ASSERT(i<
rows(), AT);
556 FMATVEC_ASSERT(
cols()==x.size(), AT);
557 for(
int j=0; j<
cols(); j++)
561 template <
class AT>
template<
class Type,
class Row,
class Col>
562 inline void Matrix<General,Var,Var,AT>::set(
const Range<Var,Var> &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A) {
564 FMATVEC_ASSERT(I.end()<
rows(), AT);
565 FMATVEC_ASSERT(J.end()<
cols(), AT);
566 FMATVEC_ASSERT(I.size()==A.rows(), AT);
567 FMATVEC_ASSERT(J.size()==A.cols(), AT);
569 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
570 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
574 template <
class AT>
template <
class Row>
575 inline void Matrix<General,Var,Var,AT>::add(
int j,
const Vector<Row,AT> &x) {
576 FMATVEC_ASSERT(j<
cols(), AT);
577 FMATVEC_ASSERT(
rows()==x.size(), AT);
578 for(
int i=0; i<
rows(); i++)
582 template <
class AT>
template <
class Col>
583 inline void Matrix<General,Var,Var,AT>::add(
int i,
const RowVector<Col,AT> &x) {
584 FMATVEC_ASSERT(i<
rows(), AT);
585 FMATVEC_ASSERT(
cols()==x.size(), AT);
586 for(
int j=0; j<
cols(); j++)
590 template <
class AT>
template<
class Type,
class Row,
class Col>
591 inline void Matrix<General,Var,Var,AT>::add(
const Range<Var,Var> &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A) {
593 FMATVEC_ASSERT(I.end()<
rows(), AT);
594 FMATVEC_ASSERT(J.end()<
cols(), AT);
595 FMATVEC_ASSERT(I.size()==A.rows(), AT);
596 FMATVEC_ASSERT(J.size()==A.cols(), AT);
598 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
599 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
600 e(i,j) += A.e(ii,jj);
605 FMATVEC_ASSERT(I.max()<
rows(), AT);
606 FMATVEC_ASSERT(J.max()<
cols(), AT);
608 Matrix<General,Var,Var,AT> A(I.size(),J.size(),NONINIT);
610 for(
int i=0; i<A.rows(); i++)
611 for(
int j=0; j<A.cols(); j++)
612 A.e(i,j) = e(I[i],J[j]);
619 FMATVEC_ASSERT(I.end()<M, AT);
620 FMATVEC_ASSERT(J.max()<
cols(), AT);
622 Matrix<General,Var,Var,AT> A(I.size(),J.size(),NONINIT);
624 for(
int i=0; i<A.rows(); i++)
625 for(
int j=0; j<A.cols(); j++)
626 A.e(i,j) = e(I.start()+i,J[j]);
633 FMATVEC_ASSERT(I.max()<
rows(), AT);
634 FMATVEC_ASSERT(J.end()<N, AT);
636 Matrix<General,Var,Var,AT> A(I.size(),J.size(),NONINIT);
638 for(
int i=0; i<A.rows(); i++)
639 for(
int j=0; j<A.cols(); j++)
640 A.e(i,j) = e(I[i],J.start()+j);
645 template <
class AT>
template<
class Row>
646 inline void Matrix<General,Var,Var,AT>::set(
const Indices &I,
int j,
const Vector<Row,AT> &x) {
647 FMATVEC_ASSERT(I.max()<
rows(), AT);
648 FMATVEC_ASSERT(j<
cols(), AT);
649 FMATVEC_ASSERT(I.size()==x.size(), AT);
650 for(
int i=0; i<I.size(); i++)
654 template <
class AT>
template <
class Type,
class Row,
class Col>
655 inline void Matrix<General,Var,Var,AT>::set(
const Indices &I,
const Indices &J,
const Matrix<Type,Row,Col,AT> &A) {
656 FMATVEC_ASSERT(I.max()<
rows(), AT);
657 FMATVEC_ASSERT(J.max()<
cols(), AT);
658 FMATVEC_ASSERT(I.size()==A.rows(), AT);
659 FMATVEC_ASSERT(J.size()==A.cols(), AT);
660 for(
int i=0; i<I.size(); i++)
661 for(
int j=0; j<J.size(); j++)
662 e(I[i],J[j]) = A.e(i,j);
665 template <
class AT>
template <
class Type,
class Row,
class Col>
666 inline void Matrix<General,Var,Var,AT>::set(
const Range<Var,Var> &I,
const Indices &J,
const Matrix<Type,Row,Col,AT> &A) {
667 FMATVEC_ASSERT(I.end()<
rows(), AT);
668 FMATVEC_ASSERT(J.max()<
cols(), AT);
669 FMATVEC_ASSERT(I.size()==A.rows(), AT);
670 FMATVEC_ASSERT(J.size()==A.cols(), AT);
671 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
672 for(
int j=0; j<J.size(); j++)
673 e(i,J[j]) = A.e(ii,j);
676 template <
class AT>
template <
class Type,
class Row,
class Col>
677 inline void Matrix<General,Var,Var,AT>::set(
const Indices &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A) {
678 FMATVEC_ASSERT(I.max()<
rows(), AT);
679 FMATVEC_ASSERT(J.end()<
cols(), AT);
680 FMATVEC_ASSERT(I.size()==A.rows(), AT);
681 FMATVEC_ASSERT(J.size()==A.cols(), AT);
682 for(
int i=0; i<I.size(); i++)
683 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
684 e(I[i],j) = A.e(i,jj);
689 std::vector<std::vector<AT>> ret(rows(),std::vector<AT>(cols()));
690 for(
int r=0; r<rows(); r++) {
691 for(
int c=0; c<cols(); c++)
699 for(
int r=0; r<
rows(); r++) {
700 if(
static_cast<int>(m[r].size())!=
cols())
701 throw std::runtime_error(
"The rows of the input have different length.");
702 for(
int c=0; c<
cols(); c++)
709 template <
class AT>
template <
class Type,
class Row,
class Col>
711 for(
int i=0; i<M; i++)
712 for(
int j=0; j<N; j++)
Shape class for general matrices.
Definition: types.h:116
This is a matrix class for general matrices.
Definition: var_general_matrix.h:41
int ldim() const
Leading dimension.
Definition: var_general_matrix.h:309
const AT & operator()(int i, int j) const
Element operator.
Definition: var_general_matrix.h:247
Matrix()
Standard constructor.
Definition: var_general_matrix.h:67
AT & operator()(int i, int j)
Element operator.
Definition: var_general_matrix.h:234
Matrix(const Matrix< General, Var, Var, AT > &A)
Copy Constructor.
Definition: var_general_matrix.h:104
const AT & e(int i, int j) const
Element operator.
Definition: var_general_matrix.h:264
Matrix(const Matrix< General, Row, Col, AT > &A)
Copy Constructor.
Definition: var_general_matrix.h:114
Matrix< General, Var, Var, AT > & operator=(const Matrix< General, Var, Var, AT > &A)
Assignment operator.
Definition: var_general_matrix.h:174
const AT & e(int i) const
Element operator.
Definition: var_general_matrix.h:276
Matrix(const Matrix< Type, Row, Col, AT > &A)
Copy Constructor.
Definition: var_general_matrix.h:124
constexpr int cols() const
Number of columns.
Definition: var_general_matrix.h:303
CBLAS_TRANSPOSE blasTrans() const
Transposed status.
Definition: var_general_matrix.h:317
AT * operator()()
Pointer operator.
Definition: var_general_matrix.h:285
CBLAS_ORDER blasOrder() const
Storage convention.
Definition: var_general_matrix.h:328
constexpr int rows() const
Number of rows.
Definition: var_general_matrix.h:297
~Matrix()
Destructor.
Definition: var_general_matrix.h:145
const AT * operator()() const
Pointer operator.
Definition: var_general_matrix.h:291
This is the basic matrix class for arbitrary matrices.
Definition: matrix.h:52
int rows() const
Number of rows.
int cols() const
Number of columns.
AT & operator()(int i, int j)
Standard constructor.
Definition: matrix.h:84
This is an index class for creating submatrices.
Definition: range.h:44
int end() const
Last element.
Definition: range.h:91
int size() const
Size.
Definition: range.h:97
int start() const
First element.
Definition: range.h:85
This is an index class for creating submatrices.
Definition: range.h:35
This is a vector class of general shape in dense storage format.
Definition: var_row_vector.h:39
This is a vector class of general shape in dense storage format.
Definition: var_vector.h:39
Namespace fmatvec.
Definition: _memory.cc:28