22 #ifndef var_general_matrix_h
23 #define var_general_matrix_h
41 typedef AT AtomicType;
69 Matrix(
int m,
int n,
Noinit) : M(m), N(n), ele(new AT[M*N]) { }
70 Matrix(
int m,
int n, Init ini=INIT,
const AT &a=0) : M(m), N(n), ele(new AT[M*N]) { init(a); }
71 Matrix(
int m,
int n, Eye ini,
const AT &a=1) : M(m), N(n), ele(new AT[M*N]) { init(ini,a); }
84 template<
class Row,
class Col>
90 template<
class Type,
class Row,
class Col>
91 explicit Matrix(
const Matrix<Type,Row,Col,AT> &A) : M(A.
rows()), N(A.
cols()), ele(new AT[M*N]) {
108 Matrix(
const char *str);
123 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Noinit) {
131 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Init ini=INIT,
const AT &a=0) {
return resize(m,n,Noinit()).
init(a); }
133 Matrix<General,Var,Var,AT>& resize(
int m,
int n, Eye ini,
const AT &a=1) {
return resize(m,n,Noinit()).
init(ini,a); }
141 inline Matrix<General,Var,Var,AT>& operator=(
const Matrix<General,Var,Var,AT> &A);
143 template <
class Type,
class Row,
class Col>
144 inline Matrix<General,Var,Var,AT>& operator=(
const Matrix<Type,Row,Col,AT> &A);
152 template<
class Type,
class Row,
class Col>
153 inline Matrix<General,Var,Var,AT>& operator<<(const Matrix<Type,Row,Col,AT> &A);
167 #ifndef FMATVEC_NO_BOUNDS_CHECK
182 #ifndef FMATVEC_NO_BOUNDS_CHECK
192 AT& e(
int i,
int j) {
200 const AT&
e(
int i,
int j)
const {
212 const AT&
e(
int i)
const {
270 return CblasColMajor;
307 template <
int M1,
int M2,
int N1,
int N2>
310 template <
int M1,
int M2>
313 template <
int N1,
int N2>
328 inline Matrix<General,Var,Var,AT>& init(Eye eye,
const AT &a=1);
329 inline Matrix<General,Var,Var,AT>& init(Noinit,
const AT &a=0) {
return *
this; }
335 inline operator std::vector<std::vector<AT> >();
342 inline Matrix(std::vector<std::vector<AT> > m);
344 inline const Matrix<General,Var,Var,AT> T()
const;
346 template<
class Row>
inline void set(
int j,
const Vector<Row,AT> &x);
348 template<
class Col>
inline void set(
int i,
const RowVector<Col,AT> &x);
350 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);
352 template<
class Row>
inline void add(
int j,
const Vector<Row,AT> &x);
354 template<
class Col>
inline void add(
int i,
const RowVector<Col,AT> &x);
356 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);
365 std::istringstream iss(strs);
368 if(c==
'[') iss.str(strs);
369 else iss.str(std::string(
"[")+strs+
"]");
398 for(
int i=0; i<M; i++)
399 for(
int j=0; j<N; j++) {
406 template <
class AT>
template<
class Type,
class Row,
class Col>
415 #ifndef FMATVEC_NO_SIZE_CHECK
416 assert(M == A.
rows());
417 assert(N == A.
cols());
435 #ifndef FMATVEC_NO_SIZE_CHECK
436 assert(M == A.
rows());
437 assert(N == A.
cols());
448 for(
int i=0; i<M*N; i++)
455 for(
int i=0; i<M; i++)
456 for(
int j=0; j<N; j++)
457 e(i,j) = (i==j) ? val : 0;
461 template <
class AT>
template<
class Type,
class Row,
class Col>
478 #ifndef FMATVEC_NO_BOUNDS_CHECK
484 for(
int i=0; i<A.
rows(); i++)
485 for(
int j=0; j<A.
cols(); j++)
491 template <
class AT>
template <
int M1,
int M2,
int N1,
int N2>
493 #ifndef FMATVEC_NO_BOUNDS_CHECK
499 for(
int i=0; i<A.
rows(); i++)
500 for(
int j=0; j<A.
cols(); j++)
501 A.e(i,j) = e(I.start()+i,J.start()+j);
506 template <
class AT>
template <
int M1,
int M2>
508 #ifndef FMATVEC_NO_BOUNDS_CHECK
512 Matrix<General,Fixed<M2-M1+1>,Var,AT> A(J.end()-J.start()+1,NONINIT);
514 for(
int i=0; i<A.
rows(); i++)
515 for(
int j=0; j<A.
cols(); j++)
516 A.e(i,j) = e(I.start()+i,J.start()+j);
521 template <
class AT>
template <
int N1,
int N2>
523 #ifndef FMATVEC_NO_BOUNDS_CHECK
527 Matrix<General,Var,Fixed<N2-N1+1>,AT> A(I.end()-I.start()+1,NONINIT);
529 for(
int i=0; i<A.
rows(); i++)
530 for(
int j=0; j<A.
cols(); j++)
531 A.e(i,j) = e(I.start()+i,J.start()+j);
537 inline const RowVector<Var,AT> Matrix<General,Var,Var,AT>::row(
int i)
const {
539 #ifndef FMATVEC_NO_BOUNDS_CHECK
544 RowVector<Var,AT> x(N,NONINIT);
546 for(
int j=0; j<N; j++)
554 inline const Vector<Var,AT> Matrix<General,Var,Var,AT>::col(
int j)
const {
556 #ifndef FMATVEC_NO_BOUNDS_CHECK
561 Vector<Var,AT> x(M,NONINIT);
563 for(
int i=0; i<M; i++)
571 inline const Matrix<General,Var,Var,AT> Matrix<General,Var,Var,AT>::T()
const {
572 Matrix<General,Var,Var,AT> A(N,M,NONINIT);
573 for(
int i=0; i<N; i++)
574 for(
int j=0; j<M; j++)
579 template <
class AT>
template <
class Row>
580 inline void Matrix<General,Var,Var,AT>::set(
int j,
const Vector<Row,AT> &x) {
581 #ifndef FMATVEC_NO_BOUNDS_CHECK
583 assert(
rows()==x.size());
585 for(
int i=0; i<
rows(); i++)
589 template <
class AT>
template <
class Col>
590 inline void Matrix<General,Var,Var,AT>::set(
int i,
const RowVector<Col,AT> &x) {
591 #ifndef FMATVEC_NO_BOUNDS_CHECK
593 assert(
cols()==x.size());
595 for(
int j=0; j<
cols(); j++)
599 template <
class AT>
template<
class Type,
class Row,
class Col>
600 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) {
602 #ifndef FMATVEC_NO_BOUNDS_CHECK
603 assert(I.end()<
rows());
604 assert(J.end()<
cols());
605 assert(I.size()==A.rows());
606 assert(J.size()==A.cols());
609 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
610 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
614 template <
class AT>
template <
class Row>
615 inline void Matrix<General,Var,Var,AT>::add(
int j,
const Vector<Row,AT> &x) {
616 #ifndef FMATVEC_NO_BOUNDS_CHECK
618 assert(
rows()==x.size());
620 for(
int i=0; i<
rows(); i++)
624 template <
class AT>
template <
class Col>
625 inline void Matrix<General,Var,Var,AT>::add(
int i,
const RowVector<Col,AT> &x) {
626 #ifndef FMATVEC_NO_BOUNDS_CHECK
628 assert(
cols()==x.size());
630 for(
int j=0; j<
cols(); j++)
634 template <
class AT>
template<
class Type,
class Row,
class Col>
635 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) {
637 #ifndef FMATVEC_NO_BOUNDS_CHECK
638 assert(I.end()<
rows());
639 assert(J.end()<
cols());
640 assert(I.size()==A.rows());
641 assert(J.size()==A.cols());
644 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
645 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
646 e(i,j) += A.e(ii,jj);
651 std::vector<std::vector<AT> > ret(rows());
652 for(
int r=0; r<rows(); r++) {
653 ret[r].resize(cols());
654 for(
int c=0; c<cols(); c++)
662 for(
int r=0; r<
rows(); r++) {
663 assert(m[r].size()==
cols());
664 for(
int c=0; c<
cols(); c++)
671 template <
class AT>
template <
class Type,
class Row,
class Col>
673 for(
int i=0; i<M; i++)
674 for(
int j=0; j<N; j++)
This is the basic matrix class for arbitrary matrices.
Definition: fmatvec.h:41
~Matrix()
Destructor.
Definition: var_general_matrix.h:112
const CBLAS_ORDER blasOrder() const
Storage convention.
Definition: var_general_matrix.h:269
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:166
AT & operator()(int i, int j)
Standard constructor.
Definition: matrix.h:86
const AT & operator()(int i, int j) const
Element operator.
Definition: var_general_matrix.h:181
bool transposed() const
The storage format of a var matrix is fortran-storage order -> return always false.
Definition: var_general_matrix.h:248
int rows() const
Number of rows.
Definition: var_general_matrix.h:233
const AT * operator()() const
Pointer operator.
Definition: var_general_matrix.h:227
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:447
Matrix()
Standard constructor.
Definition: var_general_matrix.h:61
int cols() const
Number of columns.
Definition: var_general_matrix.h:239
Matrix(const Matrix< General, Var, Var, AT > &A)
Copy Constructor.
Definition: var_general_matrix.h:80
const AT & e(int i, int j) const
Element operator.
Definition: var_general_matrix.h:200
This is an index class for creating submatrices.
Definition: range.h:35
int ldim() const
Leading dimension.
Definition: var_general_matrix.h:245
AT * operator()()
Pointer operator.
Definition: var_general_matrix.h:221
const CBLAS_TRANSPOSE blasTrans() const
Transposed status.
Definition: var_general_matrix.h:258
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:212
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