MyraMath
LowerMatrix.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_LOWERMATRIX_H
7 #define MYRAMATH_DENSE_LOWERMATRIX_H
8 
14 #include <myramath/utility/detail/LIBPUBLIC.h>
16 
19 
20 #include <utility>
21 #include <vector>
22 #include <iosfwd>
23 #ifdef MYRAMATH_ENABLE_CPP11
24 #include <initializer_list>
25 #endif
26 
27 namespace myra {
28 
29 // Forward declarations.
30 class InputStream;
31 class OutputStream;
32 template<int Arity, class Number> class Expression;
33 template<class Number> class LowerMatrix;
34 template<class Number> class Matrix;
35 
37 template <class Number> class LIBPUBLIC LowerMatrix
38  {
39  public:
40 
41  // ------------------------------------ Construction, serialization, value semantics.
42 
44  LowerMatrix();
45 
47  explicit LowerMatrix(int N);
48 
50  explicit LowerMatrix(const Expression<2,Number>& e);
51 
53  LowerMatrix(const LowerMatrix& that);
54 
56  void swap(LowerMatrix<Number>& that);
57 
58 #ifdef MYRAMATH_ENABLE_CPP11
59  LowerMatrix(LowerMatrix&& that);
61 #endif
62 
64  LowerMatrix& operator = (LowerMatrix that);
65 
67  explicit LowerMatrix(const CLowerMatrixRange<Number>& that);
68 
70  explicit LowerMatrix(const CMatrixRange<Number>& that);
71 
73  explicit LowerMatrix(InputStream& in);
74 
76  void write(OutputStream& out) const;
77 
79  const LowerMatrix<Number>& add_const() const;
80 
82  ~LowerMatrix();
83 
84  // ------------------------------------ Size queries.
85 
87  int size() const;
88 
90  uint64_t n_words() const;
91 
93  std::pair<int,int> blocking() const;
94 
95  // ------------------------------------ General slicing.
96 
98  CLowerMatrixRange<Number> range() const;
100  LowerMatrixRange<Number> range() ;
102 
104  operator CLowerMatrixRange<Number> () const;
106  operator LowerMatrixRange<Number> () ;
108 
110  CMatrixRange<Number> rectangle() const;
112  MatrixRange<Number> rectangle() ;
114 
116  const Number& operator () (int i, int j) const;
118  Number& operator () (int i, int j) ;
120 
122  const Number& at(int i, int j) const;
124  Number& at(int i, int j) ;
126 
128  // Optionally, the 'T'ranspose or 'H'ermitian of *this can be copied into the upper triangle.
130  Matrix<Number> make_Matrix(char op = 'N') const;
131  void make_Matrix(const MatrixRange<Number>& A, char op = 'N') const;
133 
134  // ------------------------------------ Lower triangular slicing.
135 
137  CMatrixRange<Number> range11 () const;
139  CMatrixRange<Number> range21 () const;
140  CMatrixRange<Number> range22t() const;
142 
144  MatrixRange<Number> range11 ();
146  MatrixRange<Number> range21 ();
147  MatrixRange<Number> range22t();
149 
150  // ------------------------------------ Manipulating numeric contents.
151 
153  // Functor f should have an operator(), that takes a Number and returns a Number.
154  template<class Functor> void transform(const Functor& f)
155  { this->range().transform(f); }
156 
158  LowerMatrix& operator = (const CLowerMatrixRange<Number>& that);
160  LowerMatrix& operator = (const Expression<2,Number>& that);
162 
164  LowerMatrix& operator = (const CMatrixRange<Number>& that);
165 
167  void assign(const CLowerMatrixRange<Number>& that);
169  void assign(const Expression<2,Number>& that);
170  void assign(const CMatrixRange<Number>& that);
172 
174  void operator += (const CLowerMatrixRange<Number>& that);
176  void operator += (const Expression<2,Number>& that);
178 
180  void operator -= (const CLowerMatrixRange<Number>& that);
182  void operator -= (const Expression<2,Number>& that);
184 
186  void operator *= (Number alpha);
187 
189  void operator /= (Number alpha);
190 
192  LowerMatrix<Number> operator -();
193 
194  // ------------------------------------ Static generators.
195 
197  static LowerMatrix<Number> identity(int N);
198 
200  static LowerMatrix<Number> random(int N);
201 
203  static LowerMatrix<Number> zeros(int N);
204 
206  static LowerMatrix<Number> ones(int N);
207 
209  static LowerMatrix<Number> fill(int N, Number c);
210 
211 #ifdef MYRAMATH_ENABLE_CPP11
212  static LowerMatrix<Number> fill_cmajor(std::initializer_list<Number> list);
214  static LowerMatrix<Number> fill_rmajor(std::initializer_list<Number> list);
215 #endif
216 
218  static LowerMatrix<Number> evaluate(const Expression<2,Number>& e);
219 
220  private:
221 
222  // Implementation detail of constructors/assignment operators.
223  void initialize(int in_N);
224 
225  // Reseats the internal range R back onto contents.
226  void reseat();
227 
228  // Size member.
229  int N;
230 
231  // Numeric contents.
232  typedef std::vector<Number> Contents;
233  Contents contents;
234 
235  // LowerMatrixRange<Number> structure, imposes layout upon contents.
237 
238  };
239 
240 // Specializing ReflectNumber<> for LowerMatrix<Number>
241 template<class Number> class ReflectNumber< LowerMatrix<Number> >
242  { public: typedef Number type; };
243 
245 LIBPUBLIC LowerMatrix<NumberS> operator + (const CLowerMatrixRange<NumberS>& A, const CLowerMatrixRange<NumberS>& B);
247 LIBPUBLIC LowerMatrix<NumberD> operator + (const CLowerMatrixRange<NumberD>& A, const CLowerMatrixRange<NumberD>& B);
248 LIBPUBLIC LowerMatrix<NumberC> operator + (const CLowerMatrixRange<NumberC>& A, const CLowerMatrixRange<NumberC>& B);
249 LIBPUBLIC LowerMatrix<NumberZ> operator + (const CLowerMatrixRange<NumberZ>& A, const CLowerMatrixRange<NumberZ>& B);
251 
253 LIBPUBLIC LowerMatrix<NumberS> operator - (const CLowerMatrixRange<NumberS>& A, const CLowerMatrixRange<NumberS>& B);
255 LIBPUBLIC LowerMatrix<NumberD> operator - (const CLowerMatrixRange<NumberD>& A, const CLowerMatrixRange<NumberD>& B);
256 LIBPUBLIC LowerMatrix<NumberC> operator - (const CLowerMatrixRange<NumberC>& A, const CLowerMatrixRange<NumberC>& B);
257 LIBPUBLIC LowerMatrix<NumberZ> operator - (const CLowerMatrixRange<NumberZ>& A, const CLowerMatrixRange<NumberZ>& B);
259 
261 LIBPUBLIC LowerMatrix<NumberS> operator * (NumberS alpha, const CLowerMatrixRange<NumberS>& A);
263 LIBPUBLIC LowerMatrix<NumberD> operator * (NumberD alpha, const CLowerMatrixRange<NumberD>& A);
264 LIBPUBLIC LowerMatrix<NumberC> operator * (NumberC alpha, const CLowerMatrixRange<NumberC>& A);
265 LIBPUBLIC LowerMatrix<NumberZ> operator * (NumberZ alpha, const CLowerMatrixRange<NumberZ>& A);
267 
269 LIBPUBLIC LowerMatrix<NumberS> operator * (const CLowerMatrixRange<NumberS>& A, NumberS alpha);
271 LIBPUBLIC LowerMatrix<NumberD> operator * (const CLowerMatrixRange<NumberD>& A, NumberD alpha);
272 LIBPUBLIC LowerMatrix<NumberC> operator * (const CLowerMatrixRange<NumberC>& A, NumberC alpha);
273 LIBPUBLIC LowerMatrix<NumberZ> operator * (const CLowerMatrixRange<NumberZ>& A, NumberZ alpha);
275 
279 LIBPUBLIC LowerMatrix<NumberZ> make_complex(const CLowerMatrixRange<NumberD>& A);
281 
283 LIBPUBLIC LowerMatrix<NumberC> make_complex(const CLowerMatrixRange<NumberS>& R, const CLowerMatrixRange<NumberS>& I);
285 LIBPUBLIC LowerMatrix<NumberZ> make_complex(const CLowerMatrixRange<NumberD>& R, const CLowerMatrixRange<NumberD>& I);
287 
289 LIBPUBLIC LowerMatrix<NumberS> realpart(const CLowerMatrixRange<NumberC>& A);
291 LIBPUBLIC LowerMatrix<NumberD> realpart(const CLowerMatrixRange<NumberZ>& A);
293 
295 LIBPUBLIC LowerMatrix<NumberS> imagpart(const CLowerMatrixRange<NumberC>& A);
297 LIBPUBLIC LowerMatrix<NumberD> imagpart(const CLowerMatrixRange<NumberZ>& A);
299 
300 } // namespace myra
301 
302 #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
Interface class for representing subranges of dense Matrix&#39;s.
Represents a mutable LowerMatrixRange.
Definition: conjugate.h:28
Range construct for a lower triangular matrix stored in rectangular packed format.
Definition: syntax.dox:1
Represents a const MatrixRange.
Definition: bothcat.h:22
Various utility functions/classes related to scalar Number types.
void transform(const Functor &f)
Overwrites every A(i,j) in this LowerMatrix with f(A(i,j)).
Definition: LowerMatrix.h:154
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
Stores a lower triangular matrix in rectangular packed format.
Definition: conjugate.h:22
Represents a const LowerMatrixRange.
Definition: conjugate.h:34
float NumberS
Useful typedefs.
Definition: Number.h:21