22#ifndef symmetric_sparse_matrix_h
23#define symmetric_sparse_matrix_h
26#include "square_matrix.h"
51 Memory<int> memI, memJ;
53 int *I{
nullptr}, *J{
nullptr};
64 static constexpr bool isVector {
false};
66 using value_type = AT;
73 explicit Matrix() : memEle(), ele(0) { }
75 explicit Matrix(
int n_,
int k_,
Noinit) : memEle(k_), memI(n_+1), memJ(k_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), n(n_), k(k_) { }
76 explicit Matrix(
int n_,
int k_, Init ini=INIT,
const AT &a=AT()) : memEle(k_), memI(n_+1), memJ(k_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), n(n_), k(k_) { init(a); }
83 Matrix(
const Matrix<SymmetricSparse,Ref,Ref,AT> &A) : memEle(A.k), memI(A.n+1), memJ(A.k), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), n(A.n), k(A.k) {
87 explicit Matrix(
int n_,
int k_,
int *I_,
int *J_,
Init ini=INIT,
const AT &a=AT()) : memEle(k_), memI(), memJ(), ele((AT*)memEle.get()), I(I_), J(J_), n(n_), k(k_) {
100 ele = (AT*)memEle.get();
101 I = (
int*)memI.get();
102 J = (
int*)memJ.get();
111 throw std::runtime_error(
"A symmetric sparse matrix cannot have different dimensions for rows and columns.");
122 FMATVEC_ASSERT(n == A.n, AT);
123 FMATVEC_ASSERT(k == A.k, AT);
133 template<
class Type,
class Row,
class Col>
135 FMATVEC_ASSERT(A.
rows() == A.
cols(), AT);
136 FMATVEC_ASSERT(n == A.
cols(), AT);
137 FMATVEC_ASSERT(k == A.nonZeroElements(), AT);
166 template<
class Type,
class Row,
class Col>
168 FMATVEC_ASSERT(A.
rows() == A.
cols(), AT);
169 int k_ = A.nonZeroElements();
170 if(n!=A.
rows() || k!=k_) resize(A.
rows(),k_,NONINIT);
192 FMATVEC_ASSERT(i>=0, AT);
193 FMATVEC_ASSERT(j>=0, AT);
194 FMATVEC_ASSERT(i<n, AT);
195 FMATVEC_ASSERT(j<n, AT);
201 FMATVEC_ASSERT(i>=0, AT);
202 FMATVEC_ASSERT(j>=0, AT);
203 FMATVEC_ASSERT(i<n, AT);
204 FMATVEC_ASSERT(j<n, AT);
209 AT& e(
int i,
int j) {
210 return ele[pos(i,j)];
213 const AT& e(
int i,
int j)
const {
214 return ele[pos(i,j)];
217 int pos(
int i,
int j)
const {
218 for(
int k=I[i]; k<I[i+1]; k++)
225 throw std::runtime_error(
"Matrix<SymmetricSparse, Ref, Ref, AT>::ldim() cannot be called.");
232 const int*
Ip()
const {
248 const int*
Jp()
const {
281 throw std::runtime_error(
"Matrix<SymmetricSparse, Ref, Ref, AT>::blasOrder() cannot be called.");
293 inline Matrix<SymmetricSparse,Ref,Ref,AT>& init(Noinit,
const AT &a=AT()) {
return *
this; }
295 int nonZeroElements()
const {
return k; }
300 template <
class AT>
template <
class Type,
class Row,
class Col>
301 inline Matrix<SymmetricSparse,Ref,Ref,AT>& Matrix<SymmetricSparse,Ref,Ref,AT>::copy(
const Matrix<Type,Row,Col,AT> &A) {
304 for(i=0; i<A.rows(); i++) {
308 for(
int j=0; j<i; j++) {
310 if(fabs(A.e(i,j))>1e-16) {
315 for(
int j=i+1; j<A.cols(); j++) {
317 if(fabs(A.e(i,j))>1e-16) {
327 template <
class AT>
template <
class Row>
328 inline Matrix<SymmetricSparse,Ref,Ref,AT>& Matrix<SymmetricSparse,Ref,Ref,AT>::copy(
const Matrix<Symmetric,Row,Row,AT> &A) {
331 for(i=0; i<A.size(); i++) {
335 for(
int j=i+1; j<A.size(); j++) {
337 if(fabs(A.ej(i,j))>1e-16) {
348 inline Matrix<SymmetricSparse,Ref,Ref,AT>& Matrix<SymmetricSparse,Ref,Ref,AT>::copy(
const Matrix<SymmetricSparse,Ref,Ref,AT> &A) {
349 for(
int i=0; i<=n; i++) {
352 for(
int i=0; i<k; i++) {
361 for(
int i=0; i<k; i++) {
This is a matrix class for sparse quadratic matrices.
Definition: symmetric_sparse_matrix.h:44
CBLAS_ORDER blasOrder() const
Storage convention.
Definition: symmetric_sparse_matrix.h:280
Matrix< SymmetricSparse, Ref, Ref, AT > & init(const AT &val)
Initialization.
Definition: symmetric_sparse_matrix.h:360
Matrix< SymmetricSparse, Ref, Ref, AT > & operator&=(Matrix< SymmetricSparse, Ref, Ref, AT > &A)
Reference operator.
Definition: symmetric_sparse_matrix.h:147
Matrix()
Standard constructor.
Definition: symmetric_sparse_matrix.h:73
AT * operator()()
Pointer operator.
Definition: symmetric_sparse_matrix.h:187
int rows() const
Number of rows.
Definition: symmetric_sparse_matrix.h:270
int size() const
Size.
Definition: symmetric_sparse_matrix.h:264
~Matrix()=default
Destructor.
Matrix< SymmetricSparse, Ref, Ref, AT > & operator=(const Matrix< SymmetricSparse, Ref, Ref, AT > &A)
Assignment operator.
Definition: symmetric_sparse_matrix.h:121
int * Ip()
Pointer operator.
Definition: symmetric_sparse_matrix.h:240
void resize(int n, int m)
Resize a symmetric sparse matrix.
Definition: symmetric_sparse_matrix.h:109
Matrix(const Matrix< SymmetricSparse, Ref, Ref, AT > &A)
Copy Constructor.
Definition: symmetric_sparse_matrix.h:83
int * Jp()
Pointer operator.
Definition: symmetric_sparse_matrix.h:256
int cols() const
Number of columns.
Definition: symmetric_sparse_matrix.h:276
const int * Jp() const
Pointer operator.
Definition: symmetric_sparse_matrix.h:248
const int * Ip() const
Pointer operator.
Definition: symmetric_sparse_matrix.h:232
const AT * operator()() const
Pointer operator.
Definition: symmetric_sparse_matrix.h:178
Matrix< SymmetricSparse, Ref, Ref, AT > & operator=(const Matrix< Type, Row, Col, AT > &A)
Assignment operator.
Definition: symmetric_sparse_matrix.h:134
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
Shape class for sparse matrices.
Definition: types.h:164
Namespace fmatvec.
Definition: _memory.cc:28