MyraMath
DiagonalMatrix.h
Go to the documentation of this file.
1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
6 #ifndef MYRAMATH_DENSE_DIAGONALMATRIX_H
7 #define MYRAMATH_DENSE_DIAGONALMATRIX_H
8 
14 #include <myramath/utility/detail/LIBPUBLIC.h>
16 
18 
19 #include <vector>
20 #include <iosfwd>
21 #ifdef MYRAMATH_ENABLE_CPP11
22 #include <initializer_list>
23 #endif
24 
25 namespace myra {
26 
27 // Forward declarations.
28 class InputStream;
29 class OutputStream;
30 template<int Arity, class Number> class Expression;
31 template<class Number> class DiagonalMatrix;
32 template<class Number> class Matrix;
33 template<class Number> class MatrixRange;
34 template<class Number> class Vector;
35 template<class Number> class VectorRange;
36 
38 template<class Number> class LIBPUBLIC DiagonalMatrix
39  {
40  public:
41 
44 
45  // ------------------------------------ Construction, serialization, value semantics.
46 
49 
51  explicit DiagonalMatrix(int N);
52 
54  explicit DiagonalMatrix(const Expression<1,Number>& e);
55 
57  DiagonalMatrix(const DiagonalMatrix& that);
58 
60  void swap (DiagonalMatrix& that);
61 
62 #ifdef MYRAMATH_ENABLE_CPP11
65 #endif
66 
68  DiagonalMatrix& operator = (DiagonalMatrix that);
69 
71  explicit DiagonalMatrix(const CDiagonalMatrixRange<Number>& that);
72 
74  explicit DiagonalMatrix(InputStream& in);
75 
77  void write(OutputStream& out) const;
78 
80  const DiagonalMatrix<Number>& add_const() const;
81 
83  ~DiagonalMatrix();
84 
85  // ------------------------------------ Size queries.
86 
88  int size() const;
89 
91  int n_words() const;
92 
93  // ------------------------------------ General slicing.
94 
96  const CDiagonalMatrixRange<Number> range() const;
98  const DiagonalMatrixRange<Number> range() ;
100 
102  operator const CDiagonalMatrixRange<Number> () const;
104  operator const DiagonalMatrixRange<Number> () ;
106 
108  const CDiagonalMatrixRange<Number> window(int n0, int n1) const;
110  const DiagonalMatrixRange<Number> window(int n0, int n1) ;
112 
114  const Number& operator() (int n) const;
116  Number& operator() (int n) ;
118 
120  const Number& at(int n) const;
122  Number& at(int n) ;
124 
125  // ------------------------------------ Diagonal slicing.
126 
128  const CDiagonalMatrixRange<Number> first(int n) const;
130  const DiagonalMatrixRange<Number> first(int n) ;
132 
134  const CDiagonalMatrixRange<Number> last(int n) const;
136  const DiagonalMatrixRange<Number> last(int n) ;
138 
139  // ------------------------------------ Manipulating numeric contents.
140 
142  // Functor f should have an operator(), that takes a Number and returns a Number.
143  template<class Functor> void transform(const Functor& f)
144  { this->range().transform(f); }
145 
147  DiagonalMatrix& operator = (const CDiagonalMatrixRange<Number>& that);
148  DiagonalMatrix& operator = (const Expression<1,Number>& that);
149 
151  void assign(const CDiagonalMatrixRange<Number>& that);
152  void assign(const Expression<1,Number>& that);
153 
155  void operator += (const CDiagonalMatrixRange<Number>& that);
156  void operator += (const Expression<1,Number>& that);
157 
159  void operator -= (const CDiagonalMatrixRange<Number>& that);
160  void operator -= (const Expression<1,Number>& that);
161 
163  void operator *= (Number alpha);
164 
166  void operator /= (Number alpha);
167 
169  DiagonalMatrix<Number> operator -();
170 
171  // ------------------------------------ Static generators.
172 
174  static DiagonalMatrix<Number> identity(int N);
175 
177  static DiagonalMatrix<Number> random(int N);
178 
180  static DiagonalMatrix<Number> inertia(int N_plus, int N_minus);
181 
183  static DiagonalMatrix<Number> zeros(int N);
184 
186  static DiagonalMatrix<Number> fill(int N, Number c);
187 
188 #ifdef MYRAMATH_ENABLE_CPP11
189  static DiagonalMatrix<Number> fill(std::initializer_list<Number> list);
191 #endif
192 
194  static DiagonalMatrix<Number> linspace(Number x0, Number x1, int N);
195 
197  static DiagonalMatrix<Number> logspace(Precision x0, Precision x1, int N);
198 
200  static DiagonalMatrix<Number> evaluate(const Expression<1,Number>& e);
201 
203  Matrix<Number> make_Matrix() const;
205  void make_Matrix(const MatrixRange<Number>& A) const;
207 
209  Vector<Number> make_Vector() const;
211  void make_Vector(const VectorRange<Number>& x) const;
213 
214  private:
215 
216  // Numeric contents.
217  typedef std::vector<Number> Contents;
218  Contents contents;
219  };
220 
222 template<class Number> class ReflectNumber< DiagonalMatrix<Number> >
223  { public: typedef Number type; };
224 
232 
240 
242 LIBPUBLIC DiagonalMatrix<NumberS> operator * (NumberS alpha, const CDiagonalMatrixRange<NumberS>& A);
244 LIBPUBLIC DiagonalMatrix<NumberD> operator * (NumberD alpha, const CDiagonalMatrixRange<NumberD>& A);
245 LIBPUBLIC DiagonalMatrix<NumberC> operator * (NumberC alpha, const CDiagonalMatrixRange<NumberC>& A);
246 LIBPUBLIC DiagonalMatrix<NumberZ> operator * (NumberZ alpha, const CDiagonalMatrixRange<NumberZ>& A);
248 
250 LIBPUBLIC DiagonalMatrix<NumberS> operator * (const CDiagonalMatrixRange<NumberS>& A, NumberS alpha);
252 LIBPUBLIC DiagonalMatrix<NumberD> operator * (const CDiagonalMatrixRange<NumberD>& A, NumberD alpha);
253 LIBPUBLIC DiagonalMatrix<NumberC> operator * (const CDiagonalMatrixRange<NumberC>& A, NumberC alpha);
254 LIBPUBLIC DiagonalMatrix<NumberZ> operator * (const CDiagonalMatrixRange<NumberZ>& A, NumberZ alpha);
256 
264 
268 LIBPUBLIC DiagonalMatrix<NumberZ> make_complex(const CDiagonalMatrixRange<NumberD>& A);
270 
276 
278 LIBPUBLIC DiagonalMatrix<NumberS> realpart(const CDiagonalMatrixRange<NumberC>& A);
280 LIBPUBLIC DiagonalMatrix<NumberD> realpart(const CDiagonalMatrixRange<NumberZ>& A);
282 
284 LIBPUBLIC DiagonalMatrix<NumberS> imagpart(const CDiagonalMatrixRange<NumberC>& A);
286 LIBPUBLIC DiagonalMatrix<NumberD> imagpart(const CDiagonalMatrixRange<NumberZ>& A);
288 
289 } // namespace myra
290 
291 #endif
Number random()
Generate random real/complex Numbers, uniformly distributed over [-1,1].
Reflects Number trait for a Container, containers of Numbers (Matrix&#39;s, Vector&#39;s, etc) should special...
Definition: Number.h:55
Represents a const DiagonalMatrixRange.
Definition: conjugate.h:35
Interface class for representing subranges of DiagonalMatrix&#39;s.
Tabulates the values of a square NxN diagonal matrix. Allows random access, but only on the diagonal...
Definition: conjugate.h:23
ReflectPrecision< Number >::type Precision
Useful typedefs.
Definition: DiagonalMatrix.h:43
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
Represents a mutable VectorRange.
Definition: axpy.h:21
Definition: syntax.dox:1
Abstraction layer, serializable objects write themselves to these.
Definition: Streams.h:39
Various utility functions/classes related to scalar Number types.
void transform(const Functor &f)
Overwrites every D(n) in this DiagonalMatrix with f(D(n)).
Definition: DiagonalMatrix.h:143
Represents a mutable MatrixRange.
Definition: conjugate.h:26
Abstraction layer, deserializable objects read themselves from these.
Definition: Streams.h:47
Tabulates a vector of length N, allows random access.
Definition: conjugate.h:21
Reflects Precision trait for a Number, scalar Number types should specialize it.
Definition: Number.h:33
Expression< 1, NumberC > make_complex(const Expression< 1, NumberS > &A)
Promotes a real Expression into a complex one.
Definition: functions_complex.cpp:122
Given an index (i,j,etc), returns a value.
Definition: arithmetic.h:19
Represents a mutable DiagonalMatrixRange.
Definition: conjugate.h:29
float NumberS
Useful typedefs.
Definition: Number.h:21