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