1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1994-2021 The Octave Project Developers
4 //
5 // See the file COPYRIGHT.md in the top-level directory of this
6 // distribution or <https://octave.org/copyright/>.
7 //
8 // This file is part of Octave.
9 //
10 // Octave is free software: you can redistribute it and/or modify it
11 // under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // Octave is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with Octave; see the file COPYING.  If not, see
22 // <https://www.gnu.org/licenses/>.
23 //
24 ////////////////////////////////////////////////////////////////////////
25 
26 #if ! defined (octave_fCDiagMatrix_h)
27 #define octave_fCDiagMatrix_h 1
28 
29 #include "octave-config.h"
30 
31 #include "DET.h"
32 #include "MDiagArray2.h"
33 #include "fCColVector.h"
34 #include "fCRowVector.h"
35 #include "fColVector.h"
36 #include "fRowVector.h"
37 #include "mx-defs.h"
38 
39 class
40 OCTAVE_API
41 FloatComplexDiagMatrix : public MDiagArray2<FloatComplex>
42 {
43 public:
44 
45   typedef FloatComplexMatrix full_matrix_type;
46 
47   typedef float real_elt_type;
48   typedef FloatComplex complex_elt_type;
49   typedef FloatComplex element_type;
50 
51   FloatComplexDiagMatrix (void) = default;
52 
53   FloatComplexDiagMatrix (const FloatComplexDiagMatrix& a) = default;
54 
55   FloatComplexDiagMatrix& operator = (const FloatComplexDiagMatrix& a) = default;
56 
57   ~FloatComplexDiagMatrix (void) = default;
58 
FloatComplexDiagMatrix(octave_idx_type r,octave_idx_type c)59   FloatComplexDiagMatrix (octave_idx_type r,
60                           octave_idx_type c)
61     : MDiagArray2<FloatComplex> (r, c) { }
62 
FloatComplexDiagMatrix(octave_idx_type r,octave_idx_type c,const FloatComplex & val)63   FloatComplexDiagMatrix (octave_idx_type r, octave_idx_type c,
64                           const FloatComplex& val)
65     : MDiagArray2<FloatComplex> (r, c, val) { }
66 
FloatComplexDiagMatrix(const Array<FloatComplex> & a)67   explicit FloatComplexDiagMatrix (const Array<FloatComplex>& a)
68     : MDiagArray2<FloatComplex> (a) { }
69 
FloatComplexDiagMatrix(const Array<FloatComplex> & a,octave_idx_type r,octave_idx_type c)70   FloatComplexDiagMatrix (const Array<FloatComplex>& a, octave_idx_type r,
71                           octave_idx_type c)
72     : MDiagArray2<FloatComplex> (a, r, c) { }
73 
FloatComplexDiagMatrix(const Array<float> & a)74   explicit FloatComplexDiagMatrix (const Array<float>& a)
75     : MDiagArray2<FloatComplex> (Array<FloatComplex> (a)) { }
76 
77   explicit FloatComplexDiagMatrix (const FloatDiagMatrix& a);
78 
FloatComplexDiagMatrix(const MDiagArray2<FloatComplex> & a)79   FloatComplexDiagMatrix (const MDiagArray2<FloatComplex>& a)
80     : MDiagArray2<FloatComplex> (a) { }
81 
82   template <typename U>
FloatComplexDiagMatrix(const DiagArray2<U> & a)83   FloatComplexDiagMatrix (const DiagArray2<U>& a)
84     : MDiagArray2<FloatComplex> (a) { }
85 
86   bool operator == (const FloatComplexDiagMatrix& a) const;
87   bool operator != (const FloatComplexDiagMatrix& a) const;
88 
89   FloatComplexDiagMatrix& fill (float val);
90   FloatComplexDiagMatrix& fill (const FloatComplex& val);
91   FloatComplexDiagMatrix& fill (float val,
92                                 octave_idx_type beg, octave_idx_type end);
93   FloatComplexDiagMatrix& fill (const FloatComplex& val,
94                                 octave_idx_type beg, octave_idx_type end);
95   FloatComplexDiagMatrix& fill (const FloatColumnVector& a);
96   FloatComplexDiagMatrix& fill (const FloatComplexColumnVector& a);
97   FloatComplexDiagMatrix& fill (const FloatRowVector& a);
98   FloatComplexDiagMatrix& fill (const FloatComplexRowVector& a);
99   FloatComplexDiagMatrix& fill (const FloatColumnVector& a,
100                                 octave_idx_type beg);
101   FloatComplexDiagMatrix& fill (const FloatComplexColumnVector& a,
102                                 octave_idx_type beg);
103   FloatComplexDiagMatrix& fill (const FloatRowVector& a, octave_idx_type beg);
104   FloatComplexDiagMatrix& fill (const FloatComplexRowVector& a,
105                                 octave_idx_type beg);
106 
hermitian(void)107   FloatComplexDiagMatrix hermitian (void) const
108   { return MDiagArray2<FloatComplex>::hermitian (std::conj); }
transpose(void)109   FloatComplexDiagMatrix transpose (void) const
110   { return MDiagArray2<FloatComplex>::transpose (); }
111   FloatDiagMatrix abs (void) const;
112 
113   friend OCTAVE_API FloatComplexDiagMatrix
114   conj (const FloatComplexDiagMatrix& a);
115 
116   // resize is the destructive analog for this one
117 
118   FloatComplexMatrix extract (octave_idx_type r1, octave_idx_type c1,
119                               octave_idx_type r2, octave_idx_type c2) const;
120 
121   // extract row or column i
122 
123   FloatComplexRowVector row (octave_idx_type i) const;
124   FloatComplexRowVector row (char *s) const;
125 
126   FloatComplexColumnVector column (octave_idx_type i) const;
127   FloatComplexColumnVector column (char *s) const;
128 
129   FloatComplexDiagMatrix inverse (octave_idx_type& info) const;
130   FloatComplexDiagMatrix inverse (void) const;
131   FloatComplexDiagMatrix pseudo_inverse (float tol = 0.0f) const;
132 
133   bool all_elements_are_real (void) const;
134 
135   // diagonal matrix by diagonal matrix -> diagonal matrix operations
136 
137   FloatComplexDiagMatrix& operator += (const FloatDiagMatrix& a);
138   FloatComplexDiagMatrix& operator -= (const FloatDiagMatrix& a);
139 
140   // other operations
141 
142   FloatComplexColumnVector extract_diag (octave_idx_type k = 0) const
143   { return MDiagArray2<FloatComplex>::extract_diag (k); }
144 
145   FloatComplexDET determinant (void) const;
146   float rcond (void) const;
147 
148   // i/o
149 
150   friend std::ostream& operator << (std::ostream& os,
151                                     const FloatComplexDiagMatrix& a);
152 
153 };
154 
155 OCTAVE_API FloatComplexDiagMatrix conj (const FloatComplexDiagMatrix& a);
156 
157 // diagonal matrix by diagonal matrix -> diagonal matrix operations
158 
159 OCTAVE_API FloatComplexDiagMatrix
160 operator * (const FloatComplexDiagMatrix& a, const FloatComplexDiagMatrix& b);
161 
162 OCTAVE_API FloatComplexDiagMatrix
163 operator * (const FloatComplexDiagMatrix& a, const FloatDiagMatrix& b);
164 
165 OCTAVE_API FloatComplexDiagMatrix
166 operator * (const FloatDiagMatrix& a, const FloatComplexDiagMatrix& b);
167 
168 MDIAGARRAY2_FORWARD_DEFS (MDiagArray2, FloatComplexDiagMatrix, FloatComplex)
169 
170 #endif
171