22 #ifndef var_general_matrix_h
23 #define var_general_matrix_h
68 Matrix(
int m,
int n,
Noinit) : M(m), N(n), ele(new AT[M*N]) { }
69 Matrix(
int m,
int n, Init ini=INIT,
const AT &a=0) : M(m), N(n), ele(new AT[M*N]) { init(a); }
70 Matrix(
int m,
int n, Eye ini,
const AT &a=1) : M(m), N(n), ele(new AT[M*N]) { init(ini,a); }
83 template<
class Row,
class Col>
89 template<
class Type,
class Row,
class Col>
90 explicit Matrix(
const Matrix<Type,Row,Col,AT> &A) : M(A.
rows()), N(A.
cols()), ele(new AT[M*N]) {
107 Matrix(
const char *str);
122 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Noinit) {
130 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Init ini=INIT,
const AT &a=0) {
return resize(m,n,Noinit()).
init(a); }
132 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Eye ini,
const AT &a=1) {
return resize(m,n,Noinit()).
init(ini,a); }
140 inline Matrix<General,Var,Var,AT>& operator=(
const Matrix<General,Var,Var,AT> &A);
142 template <
class Type,
class Row,
class Col>
143 inline Matrix<General,Var,Var,AT>& operator=(
const Matrix<Type,Row,Col,AT> &A);
151 template<
class Type,
class Row,
class Col>
152 inline Matrix<General,Var,Var,AT>& operator<<(const Matrix<Type,Row,Col,AT> &A);
166 #ifndef FMATVEC_NO_BOUNDS_CHECK
181 #ifndef FMATVEC_NO_BOUNDS_CHECK
191 AT& e(
int i,
int j) {
199 const AT&
e(
int i,
int j)
const {
211 const AT&
e(
int i)
const {
264 return CblasColMajor;
301 template <
int M1,
int M2,
int N1,
int N2>
304 template <
int M1,
int M2>
307 template <
int N1,
int N2>
322 inline Matrix<General,Var,Var,AT>& init(Eye eye,
const AT &a=1);
323 inline Matrix<General,Var,Var,AT>& init(Noinit,
const AT &a=0) {
return *
this; }
329 inline operator std::vector<std::vector<AT> >();
336 inline Matrix(std::vector<std::vector<AT> > m);
338 inline const Matrix<General,Var,Var,AT> T()
const;
340 template<
class Row>
inline void set(
int j,
const Vector<Row,AT> &x);
342 template<
class Col>
inline void set(
int i,
const RowVector<Col,AT> &x);
344 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);
346 template<
class Row>
inline void add(
int j,
const Vector<Row,AT> &x);
348 template<
class Col>
inline void add(
int i,
const RowVector<Col,AT> &x);
350 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);
359 std::istringstream iss(strs);
362 if(c==
'[') iss.str(strs);
363 else iss.str(std::string(
"[")+strs+
"]");
392 for(
int i=0; i<M; i++)
393 for(
int j=0; j<N; j++) {
400 template <
class AT>
template<
class Type,
class Row,
class Col>
409 #ifndef FMATVEC_NO_SIZE_CHECK
410 assert(M == A.
rows());
411 assert(N == A.
cols());
429 #ifndef FMATVEC_NO_SIZE_CHECK
430 assert(M == A.
rows());
431 assert(N == A.
cols());
442 for(
int i=0; i<M*N; i++)
449 for(
int i=0; i<M; i++)
450 for(
int j=0; j<N; j++)
451 e(i,j) = (i==j) ? val : 0;
455 template <
class AT>
template<
class Type,
class Row,
class Col>
472 #ifndef FMATVEC_NO_BOUNDS_CHECK
478 for(
int i=0; i<A.
rows(); i++)
479 for(
int j=0; j<A.
cols(); j++)
485 template <
class AT>
template <
int M1,
int M2,
int N1,
int N2>
487 #ifndef FMATVEC_NO_BOUNDS_CHECK
493 for(
int i=0; i<A.
rows(); i++)
494 for(
int j=0; j<A.
cols(); j++)
495 A.e(i,j) = e(I.start()+i,J.start()+j);
500 template <
class AT>
template <
int M1,
int M2>
502 #ifndef FMATVEC_NO_BOUNDS_CHECK
506 Matrix<General,Fixed<M2-M1+1>,Var,AT> A(J.end()-J.start()+1,NONINIT);
508 for(
int i=0; i<A.
rows(); i++)
509 for(
int j=0; j<A.
cols(); j++)
510 A.e(i,j) = e(I.start()+i,J.start()+j);
515 template <
class AT>
template <
int N1,
int N2>
517 #ifndef FMATVEC_NO_BOUNDS_CHECK
521 Matrix<General,Var,Fixed<N2-N1+1>,AT> A(I.end()-I.start()+1,NONINIT);
523 for(
int i=0; i<A.
rows(); i++)
524 for(
int j=0; j<A.
cols(); j++)
525 A.e(i,j) = e(I.start()+i,J.start()+j);
531 inline const RowVector<Var,AT> Matrix<General,Var,Var,AT>::row(
int i)
const {
533 #ifndef FMATVEC_NO_BOUNDS_CHECK
538 RowVector<Var,AT> x(N,NONINIT);
540 for(
int j=0; j<N; j++)
548 inline const Vector<Var,AT> Matrix<General,Var,Var,AT>::col(
int j)
const {
550 #ifndef FMATVEC_NO_BOUNDS_CHECK
555 Vector<Var,AT> x(M,NONINIT);
557 for(
int i=0; i<M; i++)
565 inline const Matrix<General,Var,Var,AT> Matrix<General,Var,Var,AT>::T()
const {
566 Matrix<General,Var,Var,AT> A(N,M,NONINIT);
567 for(
int i=0; i<N; i++)
568 for(
int j=0; j<M; j++)
573 template <
class AT>
template <
class Row>
574 inline void Matrix<General,Var,Var,AT>::set(
int j,
const Vector<Row,AT> &x) {
575 #ifndef FMATVEC_NO_BOUNDS_CHECK
577 assert(
rows()==x.size());
579 for(
int i=0; i<
rows(); i++)
583 template <
class AT>
template <
class Col>
584 inline void Matrix<General,Var,Var,AT>::set(
int i,
const RowVector<Col,AT> &x) {
585 #ifndef FMATVEC_NO_BOUNDS_CHECK
587 assert(
cols()==x.size());
589 for(
int j=0; j<
cols(); j++)
593 template <
class AT>
template<
class Type,
class Row,
class Col>
594 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) {
596 #ifndef FMATVEC_NO_BOUNDS_CHECK
597 assert(I.end()<
rows());
598 assert(J.end()<
cols());
599 assert(I.size()==A.rows());
600 assert(J.size()==A.cols());
603 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
604 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
608 template <
class AT>
template <
class Row>
609 inline void Matrix<General,Var,Var,AT>::add(
int j,
const Vector<Row,AT> &x) {
610 #ifndef FMATVEC_NO_BOUNDS_CHECK
612 assert(
rows()==x.size());
614 for(
int i=0; i<
rows(); i++)
618 template <
class AT>
template <
class Col>
619 inline void Matrix<General,Var,Var,AT>::add(
int i,
const RowVector<Col,AT> &x) {
620 #ifndef FMATVEC_NO_BOUNDS_CHECK
622 assert(
cols()==x.size());
624 for(
int j=0; j<
cols(); j++)
628 template <
class AT>
template<
class Type,
class Row,
class Col>
629 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) {
631 #ifndef FMATVEC_NO_BOUNDS_CHECK
632 assert(I.end()<
rows());
633 assert(J.end()<
cols());
634 assert(I.size()==A.rows());
635 assert(J.size()==A.cols());
638 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
639 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
640 e(i,j) += A.e(ii,jj);
645 std::vector<std::vector<AT> > ret(rows());
646 for(
int r=0; r<rows(); r++) {
647 ret[r].resize(cols());
648 for(
int c=0; c<cols(); c++)
656 for(
int r=0; r<
rows(); r++) {
657 assert(m[r].size()==
cols());
658 for(
int c=0; c<
cols(); c++)
665 template <
class AT>
template <
class Type,
class Row,
class Col>
667 for(
int i=0; i<M; i++)
668 for(
int j=0; j<N; j++)
This is the basic matrix class for arbitrary matrices.
Definition: matrix.h:56
~Matrix()
Destructor.
Definition: var_general_matrix.h:111
const CBLAS_ORDER blasOrder() const
Storage convention.
Definition: var_general_matrix.h:263
This is a vector class of general shape in dense storage format.
Definition: var_vector.h:39
This is a matrix class for general matrices.
Definition: var_general_matrix.h:38
AT & operator()(int i, int j)
Element operator.
Definition: var_general_matrix.h:165
AT & operator()(int i, int j)
Standard constructor.
Definition: matrix.h:85
const AT & operator()(int i, int j) const
Element operator.
Definition: var_general_matrix.h:180
int rows() const
Number of rows.
Definition: var_general_matrix.h:232
const AT * operator()() const
Pointer operator.
Definition: var_general_matrix.h:226
int rows() const
Number of rows.
int cols() const
Number of columns.
Matrix< General, Var, Var, AT > & init(const AT &a=0)
Initialization.
Definition: var_general_matrix.h:441
Matrix()
Standard constructor.
Definition: var_general_matrix.h:60
int cols() const
Number of columns.
Definition: var_general_matrix.h:238
Matrix(const Matrix< General, Var, Var, AT > &A)
Copy Constructor.
Definition: var_general_matrix.h:79
const AT & e(int i, int j) const
Element operator.
Definition: var_general_matrix.h:199
This is an index class for creating submatrices.
Definition: range.h:35
int ldim() const
Leading dimension.
Definition: var_general_matrix.h:244
AT * operator()()
Pointer operator.
Definition: var_general_matrix.h:220
const CBLAS_TRANSPOSE blasTrans() const
Transposed status.
Definition: var_general_matrix.h:252
Basic shape class for matrices.
Definition: types.h:100
int end() const
Last element.
Definition: range.h:95
This is an index class for creating submatrices.
Definition: range.h:44
const AT & e(int i) const
Element operator.
Definition: var_general_matrix.h:211
This is a vector class of general shape in dense storage format.
Definition: var_row_vector.h:39
int start() const
First element.
Definition: range.h:89