1 #ifndef theplu_yat_utility_diagonal_matrix 2 #define theplu_yat_utility_diagonal_matrix 25 #include "BasicMatrix.h" 26 #include "BasicVector.h" 27 #include "BLAS_utility.h" 29 #include "MatrixExpression.h" 30 #include "VectorExpression.h" 33 #include "yat_assert.h" 76 size_t rows(
void)
const;
86 const double operator()(
size_t row,
size_t col)
const;
133 class DiagonalMatrixMatrix :
138 : lhs_(lhs), rhs_(rhs) {}
139 size_t rows(
void)
const {
return lhs_.rows(); }
140 size_t columns(
void)
const {
return rhs_.columns(); }
141 double operator()(
size_t i,
size_t j)
const 142 {
return lhs_(i, i) * rhs_(i, j); }
144 void calculate_matrix(gsl_matrix*& result)
const 146 detail::reallocate(result, rows(), columns());
147 for (
size_t i=0; i<rows(); ++i)
148 for (
size_t j=0; j<columns(); ++j)
149 gsl_matrix_set(result, i, j, (*
this)(i, j));
153 const DiagonalMatrix& lhs_;
154 const BasicMatrix<T>& rhs_;
159 class DiagonalMatrixVector
160 :
public VectorExpression<DiagonalMatrixVector<T> >
163 DiagonalMatrixVector(
const DiagonalMatrix& lhs,
const BasicVector<T>& rhs)
164 : m_(lhs), vec_(rhs), size_(lhs.rows())
168 DiagonalMatrixVector(
const BasicVector<T>& lhs,
const DiagonalMatrix& rhs)
169 : m_(rhs), vec_(lhs), size_(rhs.columns())
173 double operator()(
size_t i)
const 175 YAT_ASSERT(i < size());
176 return m_(i, i) * vec_(i);
180 size_t size(
void)
const 186 void calculate_gsl_vector_p(
void)
const 188 this->allocate_memory(size_);
189 for (
size_t i=0; i<size_; ++i)
190 gsl_vector_set(this->v_, i, (*
this)(i));
193 const DiagonalMatrix& m_;
194 const BasicVector<T>& vec_;
201 class MatrixDiagonalMatrix :
202 public MatrixExpression<MatrixDiagonalMatrix<T> >
205 MatrixDiagonalMatrix(
const BasicMatrix<T>& lhs,
const DiagonalMatrix& rhs)
206 : lhs_(lhs), rhs_(rhs) {}
207 size_t rows(
void)
const {
return lhs_.rows(); }
208 size_t columns(
void)
const {
return rhs_.columns(); }
209 double operator()(
size_t i,
size_t j)
const 210 {
return lhs_(i, j) * rhs_(j, j); }
212 void calculate_matrix(gsl_matrix*& result)
const 214 detail::reallocate(result, rows(), columns());
215 for (
size_t i=0; i<rows(); ++i)
216 for (
size_t j=0; j<columns(); ++j)
217 gsl_matrix_set(result, i, j, (*
this)(i, j));
221 const BasicMatrix<T>& lhs_;
222 const DiagonalMatrix& rhs_;
227 class VectorDiagonalMatrix :
228 public BasicVector<VectorDiagonalMatrix<T> >
231 VectorDiagonalMatrix(
const BasicVector<T>& rhs,
const DiagonalMatrix& lhs)
232 : lhs_(lhs), rhs_(rhs) {}
234 double operator()(
size_t i)
const 236 YAT_ASSERT(i < size());
237 return lhs_(i) * rhs_(i, i);
240 size_t size(
void)
const 242 return rhs_.columns();
246 const gsl_vector* gsl_vector_p(
void)
const 249 gsl_vector* vec = detail::create_gsl_vector(n);
250 for (
size_t i=0; i<n; ++i)
251 gsl_vector_set(vec, i, (*
this)(i));
256 const BasicVector<T>& lhs_;
257 const DiagonalMatrix& rhs_;
261 template<
class M1,
class M2,
class OP>
263 :
public MatrixExpression<DiagonalMatrix<M1, M2, OP> >
266 DiagonalMatrix(
const M1& lhs,
const M2& rhs)
267 : lhs_(lhs), rhs_(rhs)
269 YAT_ASSERT(lhs.rows() == rhs.rows());
270 YAT_ASSERT(lhs.columns() == rhs.columns());
272 double operator()(
size_t i,
size_t j)
const 274 return get(i, j, OP());
276 size_t rows(
void)
const {
return lhs_.rows(); }
277 size_t columns(
void)
const {
return rhs_.columns(); }
278 void calculate_matrix(gsl_matrix*& m)
const 280 detail::reallocate(m, rows(), columns());
281 for (
size_t i=0; i<rows(); ++i)
282 for (
size_t j=0; j<columns(); ++j)
283 gsl_matrix_set(m, i, j, (*
this)(i,j));
290 double get(
size_t i,
size_t j, Plus)
const 291 {
return lhs_(i, j) + rhs_(i, j); }
293 double get(
size_t i,
size_t j, Minus)
const 294 {
return lhs_(i, j) - rhs_(i, j); }
311 DiagonalMatrix
operator*(
const DiagonalMatrix& lhs,
312 const DiagonalMatrix& rhs);
322 expression::DiagonalMatrixMatrix<T>
325 YAT_ASSERT(lhs.columns() == rhs.
rows());
326 return expression::DiagonalMatrixMatrix<T>(lhs, rhs);
338 expression::MatrixDiagonalMatrix<T>
341 YAT_ASSERT(lhs.
columns() == rhs.rows());
342 return expression::MatrixDiagonalMatrix<T>(lhs, rhs);
365 expression::DiagonalMatrix<DiagonalMatrix, BasicMatrix<T>,
expression::Plus>
368 YAT_ASSERT(lhs.rows() == rhs.
rows());
369 YAT_ASSERT(lhs.columns() == rhs.
columns());
370 return expression::DiagonalMatrix<DiagonalMatrix, BasicMatrix<T>,
386 YAT_ASSERT(lhs.
rows() == rhs.rows());
387 YAT_ASSERT(lhs.
columns() == rhs.columns());
415 YAT_ASSERT(lhs.rows() == rhs.
rows());
416 YAT_ASSERT(lhs.columns() == rhs.
columns());
417 return expression::DiagonalMatrix<DiagonalMatrix, BasicMatrix<T>,
433 YAT_ASSERT(lhs.
rows() == rhs.rows());
434 YAT_ASSERT(lhs.
columns() == rhs.columns());
448 expression::DiagonalMatrixVector<T>
451 YAT_ASSERT(lhs.columns() == rhs.
size());
452 return expression::DiagonalMatrixVector<T>(lhs, rhs);
464 expression::DiagonalMatrixVector<T>
467 YAT_ASSERT(lhs.
size() == rhs.rows());
468 return expression::DiagonalMatrixVector<T>(lhs, rhs);
Definition: MatrixBase.h:54
size_t size(void) const
Definition: BasicVector.h:71
expression::ScaledMatrix< T > operator*(const BasicMatrix< MatrixExpression< expression::ScaledMatrix< T > > > &A, double k)
Definition: BLAS_level3.h:162
expression::MatrixDiagonalMatrix< T > operator*(const BasicMatrix< T > &lhs, const DiagonalMatrix &rhs)
matrix matrix multiplication
Definition: DiagonalMatrix.h:339
The Department of Theoretical Physics namespace as we define it.
DiagonalMatrix & operator-=(const DiagonalMatrix &rhs)
Subtract and assign operator.
expression::DiagonalMatrixVector< T > operator*(const BasicVector< T > &lhs, const DiagonalMatrix &rhs)
vector matrix multiplication
Definition: DiagonalMatrix.h:465
size_t columns(void) const
Definition: BasicMatrix.h:67
expression::DiagonalMatrix< DiagonalMatrix, BasicMatrix< T >, expression::Minus > operator-(const DiagonalMatrix &lhs, const BasicMatrix< T > &rhs)
matrix matrix subtraction
Definition: DiagonalMatrix.h:413
expression::DiagonalMatrix< BasicMatrix< T >, DiagonalMatrix, expression::Minus > operator-(const BasicMatrix< T > &lhs, const DiagonalMatrix &rhs)
matrix matrix subtraction
Definition: DiagonalMatrix.h:431
This is the yat interface to GSL vector.
Definition: Vector.h:59
Definition: BLAS_utility.h:31
This is the yat interface to GSL vector.
Definition: VectorBase.h:55
const double operator()(size_t row, size_t col) const
size_t rows(void) const
Definition: BasicMatrix.h:61
An expression that can be converted to a Matrix.
Definition: MatrixExpression.h:46
Definition: BasicVector.h:48
Definition: BLAS_utility.h:30
expression::DiagonalMatrixMatrix< T > operator*(const DiagonalMatrix &lhs, const BasicMatrix< T > &rhs)
matrix matrix multiplication
Definition: DiagonalMatrix.h:323
Definition: BasicMatrix.h:38
DiagonalMatrix(void)
Default constructor.
DiagonalMatrix & operator*=(const DiagonalMatrix &rhs)
Multiplication and assign operator.
expression::DiagonalMatrixVector< T > operator*(const DiagonalMatrix &lhs, const BasicVector< T > &rhs)
matrix vector multiplication
Definition: DiagonalMatrix.h:449
expression::DiagonalMatrix< DiagonalMatrix, BasicMatrix< T >, expression::Plus > operator+(const DiagonalMatrix &lhs, const BasicMatrix< T > &rhs)
matrix matrix addition
Definition: DiagonalMatrix.h:366
Diagonal Matrix.
Definition: DiagonalMatrix.h:49
size_t columns(void) const
DiagonalMatrix & operator+=(const DiagonalMatrix &rhs)
Add and assign operator.
expression::ScaledMatrix< T > operator-(const BasicMatrix< MatrixExpression< expression::ScaledMatrix< T > > > &A)
Definition: BLAS_level3.h:194
expression::DiagonalMatrix< BasicMatrix< T >, DiagonalMatrix, expression::Plus > operator+(const BasicMatrix< T > &lhs, const DiagonalMatrix &rhs)
matrix matrix addition
Definition: DiagonalMatrix.h:384