GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MDiagArray2.h
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1996-2024 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_MDiagArray2_h)
27 #define octave_MDiagArray2_h 1
28 
29 #include "octave-config.h"
30 
31 #include "DiagArray2.h"
32 #include "MArray.h"
33 
34 template <typename T> class MDiagArray2;
35 
36 template <typename T> MDiagArray2<T> operator + (const MDiagArray2<T>&);
37 template <typename T> MDiagArray2<T> operator - (const MDiagArray2<T>&);
38 template <typename T> MDiagArray2<T> operator * (const MDiagArray2<T>&,
39  const T&);
40 template <typename T> MDiagArray2<T> operator / (const MDiagArray2<T>&,
41  const T&);
42 template <typename T> MDiagArray2<T> operator * (const T&,
43  const MDiagArray2<T>&);
44 template <typename T> MDiagArray2<T> operator + (const MDiagArray2<T>&,
45  const MDiagArray2<T>&);
46 template <typename T> MDiagArray2<T> operator - (const MDiagArray2<T>&,
47  const MDiagArray2<T>&);
48 template <typename T> MDiagArray2<T> product (const MDiagArray2<T>&,
49  const MDiagArray2<T>&);
50 
51 //! Template for two dimensional diagonal array with math operators.
52 template <typename T>
53 class
56 {
57 public:
58 
59  MDiagArray2 () : DiagArray2<T> () { }
60 
62 
64  : DiagArray2<T> (r, c, val) { }
65 
66  MDiagArray2 (const MDiagArray2<T>& a) : DiagArray2<T> (a) { }
67 
68  MDiagArray2 (const DiagArray2<T>& a) : DiagArray2<T> (a) { }
69 
70  template <typename U>
71  MDiagArray2 (const DiagArray2<U>& a) : DiagArray2<T> (a) { }
72 
73  explicit MDiagArray2 (const Array<T>& a) : DiagArray2<T> (a) { }
74 
76  : DiagArray2<T> (a, r, c) { }
77 
78  ~MDiagArray2 () = default;
79 
81  {
83  return *this;
84  }
85 
87  {
89  }
90 
92  {
93  const T *d = this->data ();
94 
95  octave_idx_type nel = this->length ();
96 
97  static constexpr T zero = T ();
98 
99  return std::count_if (d, d + nel,
100  [] (T elem) { return elem != zero; });
101  }
102 
104  { return DiagArray2<T>::extract_diag (k); }
105 
107  MDiagArray2<T> hermitian (T (*fcn) (const T&) = nullptr) const
108  { return DiagArray2<T>::hermitian (fcn); }
109 
110  OCTAVE_API bool is_multiple_of_identity (T val) const;
111 
112  // Currently, the OPS functions don't need to be friends, but that
113  // may change.
114 
115  friend OCTAVE_API MDiagArray2<T> operator + <> (const MDiagArray2<T>&);
116  friend OCTAVE_API MDiagArray2<T> operator - <> (const MDiagArray2<T>&);
118  operator * <> (const MDiagArray2<T>&, const T&);
120  operator / <> (const MDiagArray2<T>&, const T&);
122  operator * <> (const T&, const MDiagArray2<T>&);
124  operator + <> (const MDiagArray2<T>&, const MDiagArray2<T>&);
126  operator - <> (const MDiagArray2<T>&, const MDiagArray2<T>&);
128  product <> (const MDiagArray2<T>&, const MDiagArray2<T>&);
129 
130 };
131 
132 #define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \
133  inline R \
134  operator + (const R& x) \
135  { \
136  return R (operator + (dynamic_cast<const B<T>&> (x))); \
137  } \
138  inline R \
139  operator - (const R& x) \
140  { \
141  return R (operator - (dynamic_cast<const B<T>&> (x))); \
142  } \
143  inline R \
144  operator * (const R& x, const T& y) \
145  { \
146  return R (operator * (dynamic_cast<const B<T>&> (x), (y))); \
147  } \
148  inline R \
149  operator / (const R& x, const T& y) \
150  { \
151  return R (operator / (dynamic_cast<const B<T>&> (x), (y))); \
152  } \
153  inline R \
154  operator * (const T& x, const R& y) \
155  { \
156  return R (operator * ( (x), dynamic_cast<const B<T>&> (y))); \
157  } \
158  inline R \
159  operator + (const R& x, const R& y) \
160  { \
161  return R (operator + (dynamic_cast<const B<T>&> (x), \
162  dynamic_cast<const B<T>&> (y))); \
163  } \
164  inline R \
165  operator - (const R& x, const R& y) \
166  { \
167  return R (operator - (dynamic_cast<const B<T>&> (x), \
168  dynamic_cast<const B<T>&> (y))); \
169  } \
170  inline R \
171  product (const R& x, const R& y) \
172  { \
173  return R (product (dynamic_cast<const B<T>&> (x), \
174  dynamic_cast<const B<T>&> (y))); \
175  }
176 
177 #endif
MDiagArray2< T > operator/(const MDiagArray2< T > &, const T &)
Definition: MDiagArray2.cc:67
MDiagArray2< T > operator-(const MDiagArray2< T > &)
Definition: MDiagArray2.cc:108
MDiagArray2< T > product(const MDiagArray2< T > &, const MDiagArray2< T > &)
Definition: MDiagArray2.cc:95
MDiagArray2< T > operator*(const MDiagArray2< T > &, const T &)
Definition: MDiagArray2.cc:66
MDiagArray2< T > operator+(const MDiagArray2< T > &)
Definition: MDiagArray2.cc:101
Array< T > array_value() const
Definition: DiagArray2.cc:116
Array< T > extract_diag(octave_idx_type k=0) const
Definition: DiagArray2.cc:50
DiagArray2< T > & operator=(const DiagArray2< T > &a)
Definition: DiagArray2.h:74
octave_idx_type length() const
Definition: DiagArray2.h:95
T elem(octave_idx_type r, octave_idx_type c) const
Definition: DiagArray2.h:117
DiagArray2< T > hermitian(T(*fcn)(const T &)=nullptr) const
Definition: DiagArray2.cc:76
DiagArray2< T > transpose() const
Definition: DiagArray2.cc:69
const T * data() const
Definition: DiagArray2.h:169
Template for N-dimensional array classes with like-type math operators.
Definition: MArray.h:63
Template for two dimensional diagonal array with math operators.
Definition: MDiagArray2.h:56
MDiagArray2(octave_idx_type r, octave_idx_type c)
Definition: MDiagArray2.h:61
MDiagArray2< T > transpose() const
Definition: MDiagArray2.h:106
MDiagArray2(const DiagArray2< U > &a)
Definition: MDiagArray2.h:71
MDiagArray2< T > hermitian(T(*fcn)(const T &)=nullptr) const
Definition: MDiagArray2.h:107
bool is_multiple_of_identity(T val) const
Definition: MDiagArray2.cc:36
MDiagArray2< T > & operator=(const MDiagArray2< T > &a)
Definition: MDiagArray2.h:80
octave_idx_type nnz() const
Definition: MDiagArray2.h:91
MDiagArray2(const Array< T > &a)
Definition: MDiagArray2.h:73
~MDiagArray2()=default
MDiagArray2(const DiagArray2< T > &a)
Definition: MDiagArray2.h:68
MDiagArray2(const MDiagArray2< T > &a)
Definition: MDiagArray2.h:66
MDiagArray2(const Array< T > &a, octave_idx_type r, octave_idx_type c)
Definition: MDiagArray2.h:75
MArray< T > diag(octave_idx_type k=0) const
Definition: MDiagArray2.h:103
MArray< T > array_value() const
Definition: MDiagArray2.h:86
MDiagArray2(octave_idx_type r, octave_idx_type c, const T &val)
Definition: MDiagArray2.h:63
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
#define OCTAVE_API
Definition: main.cc:55
T * r
Definition: mx-inlines.cc:781