22 #ifndef sparse_matrix_h
23 #define sparse_matrix_h
26 #include "square_matrix.h"
51 Memory<int> memI, memJ;
70 Matrix() : memEle(), memI(), memJ(), ele(0), I(0), J(0), m(0), n(0), k(0) { }
81 Matrix(
int m_,
int n_,
int k_,
Noinit) : memEle(k_), memI(n_+1), memJ(k_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), m(n_), n(n_), k(k_) { }
82 Matrix(
int m_,
int n_,
int k_, Init ini=INIT,
const AT &a=0) : memEle(k_), memI(n_+1), memJ(k_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), m(n_), n(n_), k(k_) { init(a); }
84 Matrix(
int n_, Noinit) : memEle(n_*n_), memI(n_+1), memJ(n_*n_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), m(n_), n(n_), k(n_*n_) { }
85 Matrix(
int n_, Init ini=INIT,
const AT &a=0) : memEle(n_*n_), memI(n_+1), memJ(n_*n_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), m(n_), n(n_), k(n_*n_) { init(a); }
87 Matrix(
int m_,
int n_, Noinit) : memEle(n_*n_), memI(n_+1), memJ(n_*n_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), m(n_), n(n_), k(n_*n_) { }
88 Matrix(
int m_,
int n_, Init ini=INIT,
const AT &a=0) : memEle(n_*n_), memI(n_+1), memJ(n_*n_), ele((AT*)memEle.get()), I((int*)memI.get()), J((int*)memJ.get()), m(n_), n(n_), k(n_*n_) { init(a); }
98 Matrix(
const Matrix<Sparse,Ref,Ref,AT> &A) : memEle(A.memEle), memI(A.memI), memJ(A.memJ), ele(A.ele), I(A.I), J(A.J), m(A.m), n(A.n), k(A.k) {
116 Matrix<Sparse,Ref,Ref,AT>& resize(
int n_,
int k_, Noinit) {
117 m = n_; n = n_; k = k_;
121 ele = (AT*)memEle.get();
122 I = (
int*)memI.get();
123 J = (
int*)memJ.get();
127 Matrix<Sparse,Ref,Ref,AT>& resize(
int n,
int k, Init ini=INIT,
const AT &a=0) {
return resize(m,k,Noinit()).
init(a); }
135 inline Matrix<Sparse,Ref,Ref,AT>& operator<<(const Matrix<Sparse,Ref,Ref,AT> &A);
143 inline Matrix<Sparse,Ref,Ref,AT>&
operator>>(
const Matrix<Sparse,Ref,Ref,AT> &A);
149 inline Matrix<Sparse,Ref,Ref,AT>& operator<<(const SquareMatrix<Ref,AT> &A);
155 inline Matrix<Sparse,Ref,Ref,AT>& operator<<(const Matrix<Symmetric, Var, Var ,AT> &A);
165 inline Matrix<Sparse,Ref,Ref,AT>& operator=(
const Matrix<Sparse,Ref,Ref,AT> &A);
188 const int*
Ip()
const {
204 const int*
Jp()
const {
244 inline Matrix<Sparse,Ref,Ref,AT>& init(Noinit,
const AT &a=0) {
return *
this; }
277 ele = (AT*)memEle.get();
278 I = (
int*)memI.get();
279 J = (
int*)memJ.get();
282 #ifndef FMATVEC_NO_SIZE_CHECK
297 if(m!=A.m || n!=A.n || k!=A.k) {
304 ele = (AT*)memEle.get();
305 I = (
int*)memI.get();
306 J = (
int*)memJ.get();
324 ele = (AT*)memEle.get();
325 I = (
int*)memI.get();
326 J = (
int*)memJ.get();
333 ele = (AT*)memEle.get();
334 J = (
int*)memJ.get();
346 if (m != A.
rows() || n != A.
cols()) {
353 ele = (AT*) memEle.get();
354 I = (
int*) memI.get();
355 J = (
int*) memJ.get();
363 ele = (AT*) memEle.get();
364 J = (
int*) memJ.get();
385 for(
int i=0; i<=m; i++) {
388 for(
int i=0; i<k; i++) {
394 template <
class AT>
void Matrix<Sparse,Ref,Ref,AT>::deepCopy(
const SquareMatrix<Ref,AT> &A) {
397 for(i=0; i<A.size(); i++) {
401 for(
int j=0; j<i; j++) {
403 if(fabs(A(i,j))>1e-16) {
408 for(
int j=i+1; j<A.size(); j++) {
410 if(fabs(A(i,j))>1e-16) {
419 template <
class AT>
void Matrix<Sparse,Ref,Ref,AT>::deepCopy(
const Matrix<Symmetric, Var, Var,AT> &A) {
422 for(i=0; i<A.size(); i++) {
426 for(
int j=0; j<i; j++) {
428 if(fabs(A(i,j))>1e-16) {
433 for(
int j=i+1; j<A.size(); j++) {
435 if(fabs(A(i,j))>1e-16) {
446 for(
int i=0; i<k; i++) {
Matrix< Sparse, Ref, Ref, AT > & init(const AT &a)
Initialization.
Definition: sparse_matrix.h:445
Matrix()
Standard constructor.
Definition: sparse_matrix.h:70
This is a matrix class for symmetric matrices.
Definition: var_symmetric_matrix.h:37
This is the basic matrix class for arbitrary matrices.
Definition: matrix.h:56
int rows() const
Number of rows.
Definition: var_symmetric_matrix.h:231
int rows() const
Number of rows.
Definition: general_matrix.h:270
AT * operator()()
Pointer operator.
Definition: sparse_matrix.h:180
int countElements(const SquareMatrix< Ref, AT > &A)
Count nonzero elements.
Definition: linear_algebra.h:1839
This is a matrix class for sparse quadratic matrices.
Definition: sparse_matrix.h:44
int * Ip()
Pointer operator.
Definition: sparse_matrix.h:196
int rows() const
Number of rows.
Definition: sparse_matrix.h:220
const int * Jp() const
Pointer operator.
Definition: sparse_matrix.h:204
int * Jp()
Pointer operator.
Definition: sparse_matrix.h:212
std::istream & operator>>(std::istream &is, Matrix< Type, Row, Col, AT > &A)
Matrix input.
Definition: matrix.h:170
const int * Ip() const
Pointer operator.
Definition: sparse_matrix.h:188
Shape class for sparse matrices.
Definition: types.h:140
Matrix(const Matrix< Sparse, Ref, Ref, AT > &A)
Copy Constructor.
Definition: sparse_matrix.h:98
~Matrix()
Destructor.
Definition: sparse_matrix.h:103
This is a matrix class of general quadratic matrices.
Definition: square_matrix.h:38
int cols() const
Number of columns.
Definition: var_symmetric_matrix.h:237
int countElementsLT(const Matrix< Symmetric, Ref, Ref, AT > &A)
Count nonzero elements of the low triangular part of a symmetric matrix.
Definition: linear_algebra.h:1857
const AT * operator()() const
Pointer operator.
Definition: sparse_matrix.h:171
int cols() const
Number of columns.
Definition: sparse_matrix.h:226
int cols() const
Number of columns.
Definition: general_matrix.h:276