22#ifndef var_symmetric_matrix_h
23#define var_symmetric_matrix_h
55 static constexpr bool isVector {
false};
56 using value_type = AT;
66 explicit Matrix(
int m,
Noinit) : M(m), ele(new AT[M*M]) { }
67 explicit Matrix(
int m, Init ini=INIT,
const AT &a=AT()) : M(m), ele(new AT[M*M]) { init(a); }
68 explicit Matrix(
int m, Eye ini,
const AT &a=1) : M(m), ele(new AT[M*M]) { init(ini,a); }
69 explicit Matrix(
int m,
int n, Noinit) : M(m), ele(new AT[M*M]) { }
70 explicit Matrix(
int m,
int n, Init ini=INIT,
const AT &a=AT()) : M(m), ele(new AT[M*M]) { init(a); }
71 explicit Matrix(
int m,
int n, Eye ini,
const AT &a=1) : M(m), ele(new AT[M*M]) { init(ini,a); }
74 Matrix(Matrix<Symmetric,Var,Var,AT> &&src)
noexcept {
80 Matrix<Symmetric,Var,Var,AT>& operator=(Matrix<Symmetric,Var,Var,AT> &&src)
noexcept {
81 FMATVEC_ASSERT(M == src.M, AT);
113 template<
class Type,
class Row,
class Col>
115 FMATVEC_ASSERT(A.
rows() == A.
cols(), AT);
132 Matrix<Symmetric,Var,Var,AT>& resize(
int m, Init ini=INIT,
const AT &a=AT()) {
return resize(m,Noinit()).init(a); }
134 Matrix<Symmetric,Var,Var,AT>& resize(
int m, Eye ini,
const AT &a=1) {
return resize(m,Noinit()).init(ini,a); }
143 FMATVEC_ASSERT(M == A.M, AT);
153 template<
class Type,
class Row,
class Col>
155 FMATVEC_ASSERT(A.
rows() == A.
cols(), AT);
156 FMATVEC_ASSERT(M == A.
rows(), AT);
166 template<
class Type,
class Row,
class Col>
168 FMATVEC_ASSERT(A.
rows() == A.
cols(), AT);
169 if(M!=A.
rows()) resize(A.
rows(),NONINIT);
173 inline Matrix<Symmetric,Var,Var,AT>& operator<<=(Matrix<Symmetric,Var,Var,AT> &&src) {
174 FMATVEC_ASSERT(src.rows() == src.cols(), AT);
187 throw std::runtime_error(
"A symmetric matrix cannot have different dimensions for rows and columns.");
201 FMATVEC_ASSERT(i>=0, AT);
202 FMATVEC_ASSERT(j>=0, AT);
203 FMATVEC_ASSERT(i<M, AT);
204 FMATVEC_ASSERT(j<M, AT);
214 FMATVEC_ASSERT(i>=0, AT);
215 FMATVEC_ASSERT(j>=0, AT);
216 FMATVEC_ASSERT(i<M, AT);
217 FMATVEC_ASSERT(j<M, AT);
222 AT& ei(
int i,
int j) {
226 const AT& ei(
int i,
int j)
const {
230 AT& ej(
int i,
int j) {
234 const AT& ej(
int i,
int j)
const {
238 AT& e(
int i,
int j) {
239 return j > i ? ej(i,j) : ei(i,j);
242 const AT& e(
int i,
int j)
const {
243 return j > i ? ej(i,j) : ei(i,j);
263 constexpr int size()
const {
return M;}
269 constexpr int rows()
const {
return M;}
275 constexpr int cols()
const {
return M;}
291 return CblasRowMajor;
314 inline Matrix<Symmetric,Var,Var,AT>& init(Eye eye,
const AT &val=1);
315 inline Matrix<Symmetric,Var,Var,AT>& init(Noinit,
const AT &a=AT()) {
return *
this; }
319 inline const Matrix<General,Var,Var,AT>
operator()(
const Range<Var,Var> &I,
const Range<Var,Var> &J)
const;
323 inline const Matrix<Symmetric,Var,Var,AT>
operator()(
const Range<Var,Var> &I)
const;
325 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);
326 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);
328 template<
class Row>
inline void set(
const Range<Var,Var> &I,
const Matrix<Symmetric,Row,Row,AT> &A);
329 template<
class Row>
inline void add(
const Range<Var,Var> &I,
const Matrix<Symmetric,Row,Row,AT> &A);
331 inline const Matrix<General,Var,Var,AT>
operator()(
const Indices &I,
const Indices &J)
const;
333 inline const Matrix<Symmetric,Var,Var,AT>
operator()(
const Indices &I)
const;
339 explicit inline operator std::vector<std::vector<AT>>()
const;
346 explicit Matrix(
const std::vector<std::vector<AT>> &m);
348 inline int nonZeroElements()
const;
354 for(
int i=0; i<M; i++)
355 for(
int j=i; j<M; j++)
364 for(
int i=0; i<size(); i++) {
366 for(
int j=i+1; j<size(); j++) {
375 FMATVEC_ASSERT(I.
end()<M, AT);
376 FMATVEC_ASSERT(J.
end()<M, AT);
379 for(
int i=0; i<A.
rows(); i++)
380 for(
int j=0; j<A.
cols(); j++)
388 FMATVEC_ASSERT(I.
end()<M, AT);
392 for(
int i=0; i<A.
rows(); i++)
393 for(
int j=i; j<A.
cols(); j++)
399 template <
class AT>
template<
class Type,
class Row,
class Col>
400 inline void Matrix<Symmetric,Var,Var,AT>::set(
const Range<Var,Var> &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A) {
403 else FMATVEC_ASSERT(J.
start()>=I.
end(), AT);
404 FMATVEC_ASSERT(I.
end()<
rows(), AT);
405 FMATVEC_ASSERT(J.
end()<
cols(), AT);
406 FMATVEC_ASSERT(I.
size()==A.
rows(), AT);
407 FMATVEC_ASSERT(J.
size()==A.
cols(), AT);
409 for(
int i=I.
start(), ii=0; i<=I.
end(); i++, ii++)
410 for(
int j=J.
start(), jj=0; j<=J.
end(); j++, jj++)
414 template <
class AT>
template<
class Type,
class Row,
class Col>
415 inline void Matrix<Symmetric,Var,Var,AT>::add(
const Range<Var,Var> &I,
const Range<Var,Var> &J,
const Matrix<Type,Row,Col,AT> &A) {
417 if(I.start()>=J.start()) FMATVEC_ASSERT(I.start()>=J.end(), AT)
418 else FMATVEC_ASSERT(J.start()>=I.end(), AT);
419 FMATVEC_ASSERT(I.end()<
rows(), AT);
420 FMATVEC_ASSERT(J.end()<
cols(), AT);
421 FMATVEC_ASSERT(I.size()==A.rows(), AT);
422 FMATVEC_ASSERT(J.size()==A.cols(), AT);
424 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
425 for(
int j=J.start(), jj=0; j<=J.end(); j++, jj++)
426 e(i,j) += A.e(ii,jj);
429 template <
class AT>
template<
class Row>
430 inline void Matrix<Symmetric,Var,Var,AT>::set(
const Range<Var,Var> &I,
const Matrix<Symmetric,Row,Row,AT> &A) {
432 FMATVEC_ASSERT(I.end()<size(), AT);
433 FMATVEC_ASSERT(I.size()==A.size(), AT);
435 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
436 for(
int j=i, jj=ii; j<=I.end(); j++, jj++)
440 template <
class AT>
template<
class Row>
441 inline void Matrix<Symmetric,Var,Var,AT>::add(
const Range<Var,Var> &I,
const Matrix<Symmetric,Row,Row,AT> &A) {
443 FMATVEC_ASSERT(I.end()<size(), AT);
444 FMATVEC_ASSERT(I.size()==A.size(), AT);
446 for(
int i=I.start(), ii=0; i<=I.end(); i++, ii++)
447 for(
int j=i, jj=ii; j<=I.end(); j++, jj++)
448 e(i,j) += A.e(ii,jj);
453 FMATVEC_ASSERT(I.max()<size(), AT);
454 FMATVEC_ASSERT(J.max()<size(), AT);
456 Matrix<General,Var,Var,AT> A(I.size(),J.size(),NONINIT);
458 for(
int i=0; i<A.rows(); i++)
459 for(
int j=0; j<A.cols(); j++)
460 A.e(i,j) = e(I[i],J[j]);
467 FMATVEC_ASSERT(I.max()<size(), AT);
469 Matrix<Symmetric,Var,Var,AT> A(I.size(),NONINIT);
471 for(
int i=0; i<A.rows(); i++)
472 for(
int j=0; j<A.cols(); j++)
473 A.e(i,j) = e(I[i],I[j]);
480 std::vector<std::vector<AT>> ret(rows(),std::vector<AT>(cols()));
481 for(
int r=0; r<rows(); r++) {
482 for(
int c=r; c<cols(); c++) {
493 for(
int r=0; r<
rows(); r++) {
494 if(
static_cast<int>(m[r].size())!=
cols())
495 throw std::runtime_error(
"The rows of the input have different length.");
496 for(
int c=r; c<
cols(); c++) {
498 if(c>r && abs(m[r][c]-m[c][r])>abs(m[r][c]*1e-13+1e-13))
499 throw std::runtime_error(
"The input is not symmetric.");
506 template <
class AT>
template <
class Type,
class Row,
class Col>
508 for(
int i=0; i<M; i++)
509 for(
int j=i; j<M; j++)
514 template <
class AT>
template <
class Row>
515 inline Matrix<Symmetric,Var,Var,AT>& Matrix<Symmetric,Var,Var,AT>::copy(
const Matrix<Symmetric,Row,Row,AT> &A) {
516 for(
int i=0; i<M; i++)
517 for(
int j=i; j<M; j++)
523 inline int Matrix<Symmetric,Var,Var,AT>::nonZeroElements()
const {
525 for (
int j = 0; j < M; j++) {
526 for (
int i = j+1; i < M; i++) {
527 if (fabs(e(i, j)) > 1e-16) {
This is a matrix class for general matrices.
Definition: var_general_matrix.h:41
constexpr int cols() const
Number of columns.
Definition: var_general_matrix.h:303
constexpr int rows() const
Number of rows.
Definition: var_general_matrix.h:297
This is a matrix class for symmetric matrices.
Definition: var_symmetric_matrix.h:39
Matrix(const Matrix< Symmetric, Row, Row, AT > &A)
Copy Constructor.
Definition: var_symmetric_matrix.h:104
Matrix()
Standard constructor.
Definition: var_symmetric_matrix.h:63
const AT * operator()() const
Pointer operator.
Definition: var_symmetric_matrix.h:257
Matrix< Symmetric, Var, Var, AT > & operator=(const Matrix< Symmetric, Var, Var, AT > &A)
Assignment operator.
Definition: var_symmetric_matrix.h:142
AT & operator()(int i, int j)
Element operator.
Definition: var_symmetric_matrix.h:200
int ldim() const
Leading dimension.
Definition: var_symmetric_matrix.h:281
CBLAS_ORDER blasOrder() const
Storage convention.
Definition: var_symmetric_matrix.h:290
const AT & operator()(int i, int j) const
Element operator.
Definition: var_symmetric_matrix.h:213
CBLAS_UPLO blasUplo() const
Symmetry convention.
Definition: var_symmetric_matrix.h:301
Matrix(const Matrix< Symmetric, Var, Var, AT > &A)
Copy Constructor.
Definition: var_symmetric_matrix.h:94
constexpr int size() const
Size.
Definition: var_symmetric_matrix.h:263
constexpr int cols() const
Number of columns.
Definition: var_symmetric_matrix.h:275
AT * operator()()
Pointer operator.
Definition: var_symmetric_matrix.h:251
~Matrix()
Destructor.
Definition: var_symmetric_matrix.h:121
void resize(int n, int m)
Definition: var_symmetric_matrix.h:185
Matrix(const Matrix< Type, Row, Col, AT > &A)
Copy Constructor.
Definition: var_symmetric_matrix.h:114
constexpr int rows() const
Number of rows.
Definition: var_symmetric_matrix.h:269
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
Shape class for symmetric matrices.
Definition: types.h:132
Namespace fmatvec.
Definition: _memory.cc:28