22 #ifndef var_symmetric_matrix_h
23 #define var_symmetric_matrix_h
53 typedef AT AtomicType;
72 Matrix(
int m, Init ini=INIT,
const AT &a=0) : M(m), ele(new AT[M*M]) { init(a); }
73 Matrix(
int m, Eye ini,
const AT &a=1) : M(m), ele(new AT[M*M]) { init(ini,a); }
74 Matrix(
int m,
int n, Noinit) : M(m), ele(new AT[M*M]) { }
75 Matrix(
int m,
int n, Init ini=INIT,
const AT &a=0) : M(m), ele(new AT[M*M]) { init(a); }
76 Matrix(
int m,
int n, Eye ini,
const AT &a=1) : M(m), ele(new AT[M*M]) { init(ini,a); }
95 explicit Matrix(
const Matrix<General,Fixed<M>,Fixed<M>,AT>& A) : M(A.M), ele(new AT[M*M]) {
99 template<
class Type,
class Row,
class Col>
100 explicit Matrix(
const Matrix<Type,Row,Col,AT> &A) : M(A.
rows()), ele(new AT[M*M]) {
102 #ifndef FMATVEC_NO_SIZE_CHECK
103 assert(A.rows() == M);
104 assert(A.cols() == M);
123 Matrix<Symmetric,Var,Var,AT>& resize(
int m, Noinit) {
130 Matrix<Symmetric,Var,Var,AT>& resize(
int m, Init ini=INIT,
const AT &a=0) {
return resize(m,Noinit()).
init(a); }
132 Matrix<Symmetric,Var,Var,AT>& resize(
int m, Eye ini,
const AT &a=1) {
return resize(m,Noinit()).
init(ini,a); }
140 inline Matrix<Symmetric,Var,Var,AT>& operator=(
const Matrix<Symmetric,Var,Var,AT> &A);
142 template<
class Type,
class Row,
class Col>
143 inline Matrix<Symmetric,Var,Var,AT>& operator=(
const Matrix<Type,Row,Col,AT> &A);
145 template<
class Type,
class Row,
class Col>
146 inline Matrix<Symmetric,Var,Var,AT>& operator<<(const Matrix<Type,Row,Col,AT> &A);
152 throw std::runtime_error(
"A symmetric matrix cannot have different dimensions for rows and columns.");
173 #ifndef FMATVEC_NO_BOUNDS_CHECK
188 #ifndef FMATVEC_NO_BOUNDS_CHECK
198 AT& ei(
int i,
int j) {
202 const AT& ei(
int i,
int j)
const {
206 AT& ej(
int i,
int j) {
210 const AT& ej(
int i,
int j)
const {
214 AT& e(
int i,
int j) {
215 return j > i ? ej(i,j) : ei(i,j);
218 const AT& e(
int i,
int j)
const {
219 return j > i ? ej(i,j) : ei(i,j);
267 return CblasColMajor;
290 inline Matrix<Symmetric,Var,Var,AT>& init(Eye eye,
const AT &a=1);
291 inline Matrix<Symmetric,Var,Var,AT>& init(Noinit,
const AT &a=0) {
return *
this; }
297 inline operator std::vector<std::vector<AT> >();
308 #ifndef FMATVEC_NO_SIZE_CHECK
309 assert(M == A.
size());
318 template <
class AT>
template <
class Type,
class Row,
class Col>
326 #ifndef FMATVEC_NO_SIZE_CHECK
328 assert(M == A.
rows());
337 template <
class AT>
template <
class Type,
class Row,
class Col>
338 inline Matrix<Symmetric,Var,Var,AT>& Matrix<Symmetric,Var,Var,AT>::operator<<(
const Matrix<Type,Row,Col,AT> &A) {
340 #ifndef FMATVEC_NO_SIZE_CHECK
341 assert(A.rows() == A.cols());
358 for(
int i=0; i<M; i++)
359 for(
int j=i; j<M; j++)
368 for(
int i=0; i<size(); i++) {
370 for(
int j=i+1; j<size(); j++) {
379 std::vector<std::vector<AT> > ret(rows());
380 for(
int r=0; r<rows(); r++) {
381 ret[r].resize(cols());
382 for(
int c=0; c<cols(); c++)
383 ret[r][c]=
operator()(r,c);
390 template <
class AT>
template <
class Type,
class Row,
class Col>
392 for(
int i=0; i<M; i++)
393 for(
int j=i; j<M; j++)
397 template <
class AT>
template <
class Row>
398 inline void Matrix<Symmetric,Var,Var,AT>::deepCopy(
const Matrix<Symmetric,Row,Row,AT> &A) {
399 for(
int i=0; i<M; i++)
400 for(
int j=i; j<M; j++)
This is a matrix class for symmetric matrices.
Definition: var_symmetric_matrix.h:37
This is the basic matrix class for arbitrary matrices.
Definition: fmatvec.h:41
int rows() const
Number of rows.
Definition: var_symmetric_matrix.h:245
Shape class for symmetric matrices.
Definition: types.h:116
int ldim() const
Leading dimension.
Definition: var_symmetric_matrix.h:257
const CBLAS_UPLO blasUplo() const
Symmetry convention.
Definition: var_symmetric_matrix.h:277
int rows() const
Number of rows.
Matrix< Symmetric, Var, Var, AT > & init(const AT &a=0)
Initialization.
Definition: var_symmetric_matrix.h:356
int cols() const
Number of columns.
Matrix(const Matrix< Symmetric, Var, Var, AT > &A)
Copy Constructor.
Definition: var_symmetric_matrix.h:85
AT * operator()()
Pointer operator.
Definition: var_symmetric_matrix.h:227
AT & operator()(int i, int j)
Element operator.
Definition: var_symmetric_matrix.h:172
const AT * operator()() const
Pointer operator.
Definition: var_symmetric_matrix.h:233
bool transposed()
The storage format of a var symmetric matrix is fortran-storge order -> return always false...
Definition: var_symmetric_matrix.h:157
~Matrix()
Destructor.
Definition: var_symmetric_matrix.h:112
Matrix()
Standard constructor.
Definition: var_symmetric_matrix.h:59
const CBLAS_ORDER blasOrder() const
Storage convention.
Definition: var_symmetric_matrix.h:266
int size() const
Size.
Definition: var_symmetric_matrix.h:239
const AT & operator()(int i, int j) const
Element operator.
Definition: var_symmetric_matrix.h:187
void resize(int n, int m)
Definition: var_symmetric_matrix.h:150
int cols() const
Number of columns.
Definition: var_symmetric_matrix.h:251