GNU Octave 11.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
intNDArray.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 2004-2026 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// This file should not include config.h. It is only included in other
27// C++ source files that should have included config.h before including
28// this file.
29
30#include "Array-util.h"
31#include "mx-base.h"
32#include "lo-ieee.h"
33#include "mx-inlines.cc"
34
35// unary operations
36
37template <typename T>
40{
41 boolNDArray b (this->dims ());
42
43 for (octave_idx_type i = 0; i < this->numel (); i++)
44 b.elem (i) = ! this->elem (i);
45
46 return b;
47}
48
49template <typename T>
50bool
52{
53 octave_idx_type nel = this->numel ();
54
55 for (octave_idx_type i = 0; i < nel; i++)
56 {
57 T val = this->elem (i);
58
59 if (val != 0.0 && val != 1.0)
60 return true;
61 }
62
63 return false;
64}
65
66template <typename T>
69{
70 return MArray<T>::diag (k);
71}
73template <typename T>
79
80// FIXME: this is not quite the right thing.
81
82template <typename T>
84intNDArray<T>::all (int dim) const
86 return do_mx_red_op<bool, T > (*this, dim, mx_inline_all);
89template <typename T>
91intNDArray<T>::any (int dim) const
93 return do_mx_red_op<bool, T > (*this, dim, mx_inline_any);
94}
95
96template <typename T>
97void
99 const dim_vector& dimensions,
100 int start_dimension)
102 ::increment_index (ra_idx, dimensions, start_dimension);
103}
104
105template <typename T>
108 const dim_vector& dimensions)
110 return ::compute_index (ra_idx, dimensions);
111}
112
113template <typename T>
117{
118 if (rb.numel () > 0)
119 insert (rb, ra_idx);
120 return *this;
121}
122
123template <typename T>
127{
129 return *this;
131
132template <typename T>
136{
138 return *this;
139}
140
141// This contains no information on the array structure !!!
142
143template <typename T>
144std::ostream&
145operator << (std::ostream& os, const intNDArray<T>& a)
146{
147 octave_idx_type nel = a.numel ();
148
149 for (octave_idx_type i = 0; i < nel; i++)
150 os << ' ' << a.elem (i) << "\n";
151
152 return os;
153}
154
155template <typename T>
156std::istream&
157operator >> (std::istream& is, intNDArray<T>& a)
158{
159 octave_idx_type nel = a.numel ();
160
161 if (nel > 0)
162 {
163 T tmp;
164
165 for (octave_idx_type i = 0; i < nel; i++)
166 {
167 is >> tmp;
168
169 if (is)
170 a.elem (i) = tmp;
171 else
172 return is;
173 }
174 }
175
176 return is;
177}
178
179// FIXME: should abs and signum just be mapper functions?
180
181template <typename T>
184{
185 octave_idx_type nel = this->numel ();
186 intNDArray<T> ret (this->dims ());
187
188 for (octave_idx_type i = 0; i < nel; i++)
189 {
190 T val = this->elem (i);
191 ret.xelem (i) = val.abs ();
192 }
193
194 return ret;
195}
196
197template <typename T>
200{
201 octave_idx_type nel = this->numel ();
202 intNDArray<T> ret (this->dims ());
203
204 for (octave_idx_type i = 0; i < nel; i++)
205 {
206 T val = this->elem (i);
207 ret.xelem (i) = val.signum ();
208 }
209
210 return ret;
211}
212
213template <typename T>
215intNDArray<T>::flip (int dim) const
216{
217 return do_mx_flip_op<T, T> (*this, dim, mx_inline_flip);
218}
219
220template <typename T>
223{
224 return do_mx_cum_op<T, T> (*this, dim, mx_inline_cumprod);
225}
226
227template <typename T>
230{
231 return do_mx_cum_op<T, T> (*this, dim, mx_inline_cumsum);
232}
233
234template <typename T>
236intNDArray<T>::prod (int dim) const
237{
238 return do_mx_red_op<T, T> (*this, dim, mx_inline_prod);
239}
240
241template <typename T>
243intNDArray<T>::sum (int dim) const
244{
245 return do_mx_red_op<T, T> (*this, dim, mx_inline_sum);
246}
247
248template <typename T>
250intNDArray<T>::dsum (int dim) const
251{
252 return do_mx_red_op<double, T> (*this, dim, mx_inline_dsum);
253}
254
255template <typename T>
257intNDArray<T>::sumsq (int dim) const
258{
259 return do_mx_red_op<T, T> (*this, dim, mx_inline_sumsq);
260}
261
262template <typename T>
264intNDArray<T>::max (int dim, [[maybe_unused]] bool nanflag, bool realabs) const
265{
266 return do_mx_minmax_op<T> (*this, dim, realabs, mx_inline_intmax);
267}
268
269template <typename T>
272 int dim, [[maybe_unused]] bool nanflag, bool realabs) const
273{
274 return do_mx_minmax_op<T> (*this, idx_arg, dim, realabs, mx_inline_intmax);
275}
276
277template <typename T>
279intNDArray<T>::min (int dim, [[maybe_unused]] bool nanflag, bool realabs) const
280{
281 return do_mx_minmax_op<T> (*this, dim, realabs, mx_inline_intmin);
282}
283
284template <typename T>
287 int dim, [[maybe_unused]] bool nanflag, bool realabs) const
288{
289 return do_mx_minmax_op<T> (*this, idx_arg, dim, realabs, mx_inline_intmin);
290}
291
292template <typename T>
294intNDArray<T>::cummax (int dim, [[maybe_unused]] bool nanflag, bool realabs) const
295{
296 return do_mx_cumminmax_op<T> (*this, dim, realabs, mx_inline_intcummax);
297}
298
299template <typename T>
302 int dim, [[maybe_unused]] bool nanflag, bool realabs) const
303{
304 return do_mx_cumminmax_op<T> (*this, idx_arg, dim, realabs, mx_inline_intcummax);
305}
306
307template <typename T>
309intNDArray<T>::cummin (int dim, [[maybe_unused]] bool nanflag, bool realabs) const
310{
311 return do_mx_cumminmax_op<T> (*this, dim, realabs, mx_inline_intcummin);
312}
313
314template <typename T>
317 int dim, [[maybe_unused]] bool nanflag, bool realabs) const
318{
319 return do_mx_cumminmax_op<T> (*this, idx_arg, dim, realabs, mx_inline_intcummin);
320}
321
322template <typename T>
325{
326 return do_mx_diff_op<T> (*this, dim, order, mx_inline_diff);
327}
328
329#if defined (__clang__)
330# define INSTANTIATE_INTNDARRAY(T) template class OCTAVE_API intNDArray<T>
331#else
332# define INSTANTIATE_INTNDARRAY(T) template class intNDArray<T>
333#endif
void increment_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions, int start_dimension)
Definition Array-util.cc:60
N Dimensional Array with copy-on-write semantics.
Definition Array-base.h:130
T & xelem(octave_idx_type n)
Size of the specified dimension.
Definition Array-base.h:547
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition Array-base.h:585
Array< T, Alloc > & insert(const Array< T, Alloc > &a, const Array< octave_idx_type > &idx)
Insert an array into another at a specified position.
Array< T, Alloc > diag(octave_idx_type k=0) const
Get the kth super or subdiagonal.
octave_idx_type numel() const
Number of elements in the array.
Definition Array-base.h:440
Vector representing the dimensions (size) of an Array.
Definition dim-vector.h:92
boolNDArray any(int dim=-1) const
Definition intNDArray.cc:91
intNDArray & insert(const intNDArray< T > &a, octave_idx_type r, octave_idx_type c)
static void increment_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions, int start_dimension=0)
Definition intNDArray.cc:98
intNDArray sum(int dim) const
boolNDArray operator!() const
Definition intNDArray.cc:39
intNDArray flip(int dim) const
intNDArray cummax(int dim=-1, bool nanflag=true, bool realabs=true) const
intNDArray abs() const
boolNDArray all(int dim=-1) const
Definition intNDArray.cc:84
bool any_element_not_one_or_zero() const
Definition intNDArray.cc:51
intNDArray concat(const intNDArray< T > &rb, const Array< octave_idx_type > &ra_idx)
intNDArray prod(int dim) const
intNDArray diag(octave_idx_type k=0) const
Definition intNDArray.cc:68
intNDArray sumsq(int dim) const
intNDArray cumprod(int dim) const
intNDArray max(int dim=-1, bool nanflag=true, bool realabs=true) const
intNDArray signum() const
intNDArray min(int dim=-1, bool nanflag=true, bool realabs=true) const
NDArray dsum(int dim) const
static octave_idx_type compute_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions)
intNDArray cummin(int dim=-1, bool nanflag=true, bool realabs=true) const
intNDArray cumsum(int dim) const
intNDArray diff(octave_idx_type order=1, int dim=-1) const
std::istream & operator>>(std::istream &is, intNDArray< T > &a)
std::ostream & operator<<(std::ostream &os, const intNDArray< T > &a)
void mx_inline_intcummax(const T *v, T *r, octave_idx_type n, const bool realabs)
void mx_inline_intmin(const T *v, T *r, octave_idx_type n, const bool realabs)
bool mx_inline_any(const T *v, octave_idx_type n)
void mx_inline_intcummin(const T *v, T *r, octave_idx_type n, const bool realabs)
void mx_inline_cumprod(const T *v, T *r, octave_idx_type n)
void mx_inline_cumsum(const T *v, T *r, octave_idx_type n)
void mx_inline_intmax(const T *v, T *r, octave_idx_type n, const bool realabs)
void mx_inline_flip(const T *v, T *r, octave_idx_type n)
bool mx_inline_all(const T *v, octave_idx_type n)
T mx_inline_sumsq(const T *v, octave_idx_type n)
T mx_inline_sum(const T *v, octave_idx_type n)
T mx_inline_prod(const T *v, octave_idx_type n)
void mx_inline_diff(const T *v, T *r, octave_idx_type n, octave_idx_type order)
subst_template_param< std::complex, T, double >::type mx_inline_dsum(const T *v, octave_idx_type n)
T::size_type numel(const T &str)
Definition oct-string.cc:81
const octave_base_value const Array< octave_idx_type > & ra_idx