MyraMath
Matrix22.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_MATRIX22_H
7 #define MYRAMATH_DENSE_MATRIX22_H
8 
14 // For number types.
15 #include <myramath/MYRAMATH_EXPORT.h>
17 
18 namespace myra {
19 
20 // Forward declarations.
21 class InputStream;
22 class OutputStream;
23 template<class Number> class MatrixRange;
24 template<class Number> class CMatrixRange;
25 template<class Number> class Matrix22;
26 
28 template<class Number> class MYRAMATH_EXPORT Matrix22
29  {
30  public:
31 
32  // ------------------------------------ Construction, serialization, value semantics.
33 
35  Matrix22();
36 
38  Matrix22(const Matrix22<Number>& that);
39 
41  void swap(Matrix22<Number>& that);
42 
44  Matrix22<Number>& operator = (const Matrix22<Number>& that);
45 
47  explicit Matrix22(InputStream& in);
48 
50  void write(OutputStream& out) const;
51 
52  // ------------------------------------ General slicing.
53 
55  const CMatrixRange<Number> range() const;
57  const MatrixRange<Number> range();
59 
61  operator const CMatrixRange<Number> () const;
63  operator const MatrixRange<Number> ();
65 
67  Number& operator() (int i, int j);
69  const Number& operator() (int i, int j) const;
71 
72  // ------------------------------------ Manipulating numeric contents.
73 
75  void operator += (const Matrix22<Number>& that);
76 
78  void operator -= (const Matrix22<Number>& that);
79 
81  void operator *= (Number alpha);
82 
84  void operator /= (Number alpha);
85 
86  // ------------------------------------ Static generators.
87 
89  static Matrix22<Number> identity();
90 
92  static Matrix22<Number> random();
93  static Matrix22<Number> random_symmetric();
94  static Matrix22<Number> random_hermitian();
95 
97  static Matrix22<Number> zeros();
98 
100  static Matrix22<Number> ones();
101 
103  static Matrix22<Number> fill(Number c);
104 
106  static Matrix22<Number> fill_rmajor(Number a00, Number a01, Number a10, Number a11);
107 
109  static Matrix22<Number> fill_cmajor(Number a00, Number a10, Number a01, Number a11);
110 
111  private:
112 
113  // Internal contents.
114  Number data[4];
115 
116  };
117 
119 template<class Number> class ReflectNumber< Matrix22<Number> >
120  { public: typedef Number type; };
121 
123 MYRAMATH_EXPORT NumberS frobenius(const Matrix22<NumberS>& A);
125 MYRAMATH_EXPORT NumberD frobenius(const Matrix22<NumberD>& A);
126 MYRAMATH_EXPORT NumberS frobenius(const Matrix22<NumberC>& A);
127 MYRAMATH_EXPORT NumberD frobenius(const Matrix22<NumberZ>& A);
129 
131 MYRAMATH_EXPORT Matrix22<NumberS> reverse(const Matrix22<NumberS>& A);
133 MYRAMATH_EXPORT Matrix22<NumberD> reverse(const Matrix22<NumberD>& A);
134 MYRAMATH_EXPORT Matrix22<NumberC> reverse(const Matrix22<NumberC>& A);
135 MYRAMATH_EXPORT Matrix22<NumberZ> reverse(const Matrix22<NumberZ>& A);
137 
139 MYRAMATH_EXPORT Matrix22<NumberS> conjugate(const Matrix22<NumberS>& A);
141 MYRAMATH_EXPORT Matrix22<NumberD> conjugate(const Matrix22<NumberD>& A);
142 MYRAMATH_EXPORT Matrix22<NumberC> conjugate(const Matrix22<NumberC>& A);
143 MYRAMATH_EXPORT Matrix22<NumberZ> conjugate(const Matrix22<NumberZ>& A);
145 
147 MYRAMATH_EXPORT Matrix22<NumberS> transpose(const Matrix22<NumberS>& A);
149 MYRAMATH_EXPORT Matrix22<NumberD> transpose(const Matrix22<NumberD>& A);
150 MYRAMATH_EXPORT Matrix22<NumberC> transpose(const Matrix22<NumberC>& A);
151 MYRAMATH_EXPORT Matrix22<NumberZ> transpose(const Matrix22<NumberZ>& A);
153 
155 MYRAMATH_EXPORT Matrix22<NumberS> hermitian(const Matrix22<NumberS>& A);
157 MYRAMATH_EXPORT Matrix22<NumberD> hermitian(const Matrix22<NumberD>& A);
158 MYRAMATH_EXPORT Matrix22<NumberC> hermitian(const Matrix22<NumberC>& A);
159 MYRAMATH_EXPORT Matrix22<NumberZ> hermitian(const Matrix22<NumberZ>& A);
161 
163 MYRAMATH_EXPORT Matrix22<NumberC> make_complex(const Matrix22<NumberS>& A);
165 MYRAMATH_EXPORT Matrix22<NumberZ> make_complex(const Matrix22<NumberD>& A);
167 
169 MYRAMATH_EXPORT Matrix22<NumberS> gemm(const Matrix22<NumberS>& A, const Matrix22<NumberS>& B);
171 MYRAMATH_EXPORT Matrix22<NumberD> gemm(const Matrix22<NumberD>& A, const Matrix22<NumberD>& B);
172 MYRAMATH_EXPORT Matrix22<NumberC> gemm(const Matrix22<NumberC>& A, const Matrix22<NumberC>& B);
173 MYRAMATH_EXPORT Matrix22<NumberZ> gemm(const Matrix22<NumberZ>& A, const Matrix22<NumberZ>& B);
175 
177 MYRAMATH_EXPORT Matrix22<NumberC> gemm(const Matrix22<NumberS>& A, const Matrix22<NumberC>& B);
179 MYRAMATH_EXPORT Matrix22<NumberZ> gemm(const Matrix22<NumberD>& A, const Matrix22<NumberZ>& B);
181 
183 MYRAMATH_EXPORT Matrix22<NumberC> gemm(const Matrix22<NumberC>& A, const Matrix22<NumberS>& B);
185 MYRAMATH_EXPORT Matrix22<NumberZ> gemm(const Matrix22<NumberZ>& A, const Matrix22<NumberD>& B);
187 
189 MYRAMATH_EXPORT Matrix22<NumberS> inverse(const Matrix22<NumberS>& A);
191 MYRAMATH_EXPORT Matrix22<NumberD> inverse(const Matrix22<NumberD>& A);
192 MYRAMATH_EXPORT Matrix22<NumberC> inverse(const Matrix22<NumberC>& A);
193 MYRAMATH_EXPORT Matrix22<NumberZ> inverse(const Matrix22<NumberZ>& A);
195 
197 MYRAMATH_EXPORT Matrix22<NumberS> operator* (const Matrix22<NumberS>& A, const Matrix22<NumberS>& B);
199 MYRAMATH_EXPORT Matrix22<NumberD> operator* (const Matrix22<NumberD>& A, const Matrix22<NumberD>& B);
200 MYRAMATH_EXPORT Matrix22<NumberC> operator* (const Matrix22<NumberC>& A, const Matrix22<NumberC>& B);
201 MYRAMATH_EXPORT Matrix22<NumberZ> operator* (const Matrix22<NumberZ>& A, const Matrix22<NumberZ>& B);
202 
204 MYRAMATH_EXPORT Matrix22<NumberC> operator* (const Matrix22<NumberS>& A, const Matrix22<NumberC>& B);
206 MYRAMATH_EXPORT Matrix22<NumberZ> operator* (const Matrix22<NumberD>& A, const Matrix22<NumberZ>& B);
208 
210 MYRAMATH_EXPORT Matrix22<NumberC> operator* (const Matrix22<NumberC>& A, const Matrix22<NumberS>& B);
212 MYRAMATH_EXPORT Matrix22<NumberZ> operator* (const Matrix22<NumberZ>& A, const Matrix22<NumberD>& B);
214 
216 MYRAMATH_EXPORT Matrix22<NumberS> operator+ (const Matrix22<NumberS>& A, const Matrix22<NumberS>& B);
218 MYRAMATH_EXPORT Matrix22<NumberD> operator+ (const Matrix22<NumberD>& A, const Matrix22<NumberD>& B);
219 MYRAMATH_EXPORT Matrix22<NumberC> operator+ (const Matrix22<NumberC>& A, const Matrix22<NumberC>& B);
220 MYRAMATH_EXPORT Matrix22<NumberZ> operator+ (const Matrix22<NumberZ>& A, const Matrix22<NumberZ>& B);
222 
224 MYRAMATH_EXPORT Matrix22<NumberS> operator- (const Matrix22<NumberS>& A, const Matrix22<NumberS>& B);
226 MYRAMATH_EXPORT Matrix22<NumberD> operator- (const Matrix22<NumberD>& A, const Matrix22<NumberD>& B);
227 MYRAMATH_EXPORT Matrix22<NumberC> operator- (const Matrix22<NumberC>& A, const Matrix22<NumberC>& B);
228 MYRAMATH_EXPORT Matrix22<NumberZ> operator- (const Matrix22<NumberZ>& A, const Matrix22<NumberZ>& B);
230 
232 MYRAMATH_EXPORT void gemm_inplace(const Matrix22<NumberS>& A, const MatrixRange<NumberS>& B);
234 MYRAMATH_EXPORT void gemm_inplace(const Matrix22<NumberD>& A, const MatrixRange<NumberD>& B);
235 MYRAMATH_EXPORT void gemm_inplace(const Matrix22<NumberC>& A, const MatrixRange<NumberC>& B);
236 MYRAMATH_EXPORT void gemm_inplace(const Matrix22<NumberZ>& A, const MatrixRange<NumberZ>& B);
238 
240 MYRAMATH_EXPORT void gemm_inplace(const MatrixRange<NumberS>& A, const Matrix22<NumberS>& B);
242 MYRAMATH_EXPORT void gemm_inplace(const MatrixRange<NumberD>& A, const Matrix22<NumberD>& B);
243 MYRAMATH_EXPORT void gemm_inplace(const MatrixRange<NumberC>& A, const Matrix22<NumberC>& B);
244 MYRAMATH_EXPORT void gemm_inplace(const MatrixRange<NumberZ>& A, const Matrix22<NumberZ>& B);
246 
247 } // namespace
248 
249 #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
Definition: syntax.dox:1
Represents a const MatrixRange.
Definition: bothcat.h:22
Abstraction layer, serializable objects write themselves to these.
Definition: Streams.h:39
Various utility functions/classes related to scalar Number types.
Represents a mutable MatrixRange.
Definition: conjugate.h:26
Abstraction layer, deserializable objects read themselves from these.
Definition: Streams.h:47
Matrix type with fixed size 2x2.
Definition: Matrix22.h:25
Expression< 1, NumberC > make_complex(const Expression< 1, NumberS > &A)
Promotes a real Expression into a complex one.
Definition: functions_complex.cpp:122
float NumberS
Useful typedefs.
Definition: Number.h:21