GNU Octave 10.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-2025 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);
88
89template <typename T>
91intNDArray<T>::any (int dim) const
93 return do_mx_red_op<bool, T > (*this, dim, mx_inline_any);
95
96template <typename T>
97void
99 const dim_vector& dimensions,
100 int start_dimension)
102 ::increment_index (ra_idx, dimensions, start_dimension);
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;
122
123template <typename T>
127{
128 Array<T>::insert (a, r, c);
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>::prod (int dim) const
216{
217 return do_mx_red_op<T, T> (*this, dim, mx_inline_prod);
218}
219
220template <typename T>
222intNDArray<T>::sum (int dim) const
223{
224 return do_mx_red_op<T, T> (*this, dim, mx_inline_sum);
225}
226
227template <typename T>
229intNDArray<T>::dsum (int dim) const
230{
231 return do_mx_red_op<double, T> (*this, dim, mx_inline_dsum);
232}
233
234template <typename T>
237{
238 return do_mx_cum_op<T, T> (*this, dim, mx_inline_cumsum);
239}
240
241template <typename T>
243intNDArray<T>::max (int dim) const
244{
245 return do_mx_minmax_op<T> (*this, dim, mx_inline_max);
246}
247
248template <typename T>
251{
252 return do_mx_minmax_op<T> (*this, idx_arg, dim, mx_inline_max);
253}
254
255template <typename T>
257intNDArray<T>::min (int dim) const
258{
259 return do_mx_minmax_op<T> (*this, dim, mx_inline_min);
260}
261
262template <typename T>
265{
266 return do_mx_minmax_op<T> (*this, idx_arg, dim, mx_inline_min);
267}
268
269template <typename T>
272{
273 return do_mx_cumminmax_op<T> (*this, dim, mx_inline_cummax);
274}
275
276template <typename T>
279{
280 return do_mx_cumminmax_op<T> (*this, idx_arg, dim, mx_inline_cummax);
281}
282
283template <typename T>
286{
287 return do_mx_cumminmax_op<T> (*this, dim, mx_inline_cummin);
288}
289
290template <typename T>
293{
294 return do_mx_cumminmax_op<T> (*this, idx_arg, dim, mx_inline_cummin);
295}
296
297template <typename T>
300{
301 return do_mx_diff_op<T> (*this, dim, order, mx_inline_diff);
302}
303
304#if defined (__clang__)
305# define INSTANTIATE_INTNDARRAY(T) template class OCTAVE_API intNDArray<T>
306#else
307# define INSTANTIATE_INTNDARRAY(T) template class intNDArray<T>
308#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.h:130
T & xelem(octave_idx_type n)
Size of the specified dimension.
Definition Array.h:525
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition Array.h:563
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.h:418
Vector representing the dimensions (size) of an Array.
Definition dim-vector.h:90
boolNDArray any(int dim=-1) const
Definition intNDArray.cc:91
intNDArray & insert(const intNDArray< T > &a, octave_idx_type r, octave_idx_type c)
intNDArray max(int dim=-1) const
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 min(int dim=-1) 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 cummin(int dim=-1) const
intNDArray prod(int dim) const
intNDArray diag(octave_idx_type k=0) const
Definition intNDArray.cc:68
intNDArray signum() const
NDArray dsum(int dim) const
static octave_idx_type compute_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions)
intNDArray cummax(int dim=-1) 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)
bool mx_inline_any(const T *v, octave_idx_type n)
void mx_inline_cummin(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_max(const T *v, T *r, octave_idx_type n)
void mx_inline_cummax(const T *v, T *r, octave_idx_type n)
bool mx_inline_all(const T *v, octave_idx_type n)
T mx_inline_sum(const T *v, octave_idx_type n)
void mx_inline_min(const T *v, T *r, 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:74
const octave_base_value const Array< octave_idx_type > & ra_idx