GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
chNDArray.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 2003-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 (HAVE_CONFIG_H)
27 # include "config.h"
28 #endif
29 
30 #include <string>
31 
32 #include "Array-util.h"
33 #include "chNDArray.h"
34 #include "mx-base.h"
35 #include "lo-ieee.h"
36 #include "lo-mappers.h"
37 #include "mx-op-defs.h"
38 #include "str-vec.h"
39 
40 #include "bsxfun-defs.cc"
41 
43  : Array<char> ()
44 {
45  octave_idx_type n = 1;
46 
47  resize1 (n);
48 
49  elem (0) = c;
50 }
51 
52 charNDArray::charNDArray (const char *s)
53  : Array<char> ()
54 {
55  octave_idx_type n = (s ? strlen (s) : 0);
56 
57  resize1 (n);
58 
59  for (octave_idx_type i = 0; i < n; i++)
60  elem (i) = s[i];
61 }
62 
63 charNDArray::charNDArray (const std::string& s)
64  : Array<char> ()
65 {
66  octave_idx_type n = s.length ();
67 
68  resize1 (n);
69 
70  for (octave_idx_type i = 0; i < n; i++)
71  elem (i) = s[i];
72 }
73 
74 charNDArray::charNDArray (const string_vector& s, char fill_value)
75  : Array<char> (dim_vector (s.numel (), s.max_length ()), fill_value)
76 {
77  octave_idx_type nr = rows ();
78 
79  for (octave_idx_type i = 0; i < nr; i++)
80  {
81  const std::string si = s(i);
82  octave_idx_type nc = si.length ();
83  for (octave_idx_type j = 0; j < nc; j++)
84  elem (i, j) = si[j];
85  }
86 }
87 
88 // FIXME: this is not quite the right thing.
89 
91 charNDArray::all (int dim) const
92 {
93  return do_mx_red_op<bool, char> (*this, dim, mx_inline_all);
94 }
95 
97 charNDArray::any (int dim) const
98 {
99  return do_mx_red_op<bool, char> (*this, dim, mx_inline_any);
100 }
101 
105 {
106  if (rb.numel () > 0)
107  insert (rb, ra_idx);
108  return *this;
109 }
110 
113 {
114  charNDArray tmp (rb.dims ());
115  octave_idx_type nel = rb.numel ();
116 
117  if (rb.isempty ())
118  return *this;
119 
120  for (octave_idx_type i = 0; i < nel; i++)
121  {
122  double d = rb.elem (i);
123 
124  if (octave::math::isnan (d))
125  (*current_liboctave_error_handler)
126  ("invalid conversion from NaN to character");
127 
129 
130  if (ival < 0 || ival > std::numeric_limits<unsigned char>::max ())
131  // FIXME: is there something better to do? Should we warn the user?
132  ival = 0;
133 
134  tmp.elem (i) = static_cast<char> (ival);
135  }
136 
137  insert (tmp, ra_idx);
138  return *this;
139 }
140 
142 charNDArray::max (int dim) const
143 {
144  return do_mx_minmax_op<char> (*this, dim, mx_inline_max);
145 }
146 
148 charNDArray::max (Array<octave_idx_type>& idx_arg, int dim) const
149 {
150  return do_mx_minmax_op<char> (*this, idx_arg, dim, mx_inline_max);
151 }
152 
154 charNDArray::min (int dim) const
155 {
156  return do_mx_minmax_op<char> (*this, dim, mx_inline_min);
157 }
158 
160 charNDArray::min (Array<octave_idx_type>& idx_arg, int dim) const
161 {
162  return do_mx_minmax_op<char> (*this, idx_arg, dim, mx_inline_min);
163 }
164 
167 {
168  Array<char>::insert (a, r, c);
169  return *this;
170 }
171 
174 {
176  return *this;
177 }
178 
179 void
181  const dim_vector& dimensions,
182  int start_dimension)
183 {
184  ::increment_index (ra_idx, dimensions, start_dimension);
185 }
186 
189  const dim_vector& dimensions)
190 {
191  return ::compute_index (ra_idx, dimensions);
192 }
193 
196 {
197  return Array<char>::diag (k);
198 }
199 
202 {
203  return Array<char>::diag (m, n);
204 }
205 
207 min (char d, const charNDArray& m)
208 {
211 }
212 
214 min (const charNDArray& m, char d)
215 {
217  char> (m, d, mx_inline_xmin);
218 }
219 
221 min (const charNDArray& a, const charNDArray& b)
222 {
226  mx_inline_xmin, "min");
227 }
228 
230 max (char d, const charNDArray& m)
231 {
234 }
235 
237 max (const charNDArray& m, char d)
238 {
240  char> (m, d, mx_inline_xmax);
241 }
242 
244 max (const charNDArray& a, const charNDArray& b)
245 {
249  mx_inline_xmax, "max");
250 }
251 
254 
257 
260 
octave_idx_type compute_index(octave_idx_type n, const dim_vector &dims)
Definition: Array-util.cc:177
#define BSXFUN_STDREL_DEFS_MXLOOP(ARRAY)
Definition: bsxfun-defs.cc:244
charNDArray max(char d, const charNDArray &m)
Definition: chNDArray.cc:230
charNDArray min(char d, const charNDArray &m)
Definition: chNDArray.cc:207
N Dimensional Array with copy-on-write semantics.
Definition: Array.h:130
char & elem(octave_idx_type n)
Definition: Array.h:562
void resize1(octave_idx_type n, const char &rfv)
Definition: Array-base.cc:910
octave_idx_type rows() const
Definition: Array.h:459
Array< T, Alloc > & insert(const Array< T, Alloc > &a, const Array< octave_idx_type > &idx)
Insert an array into another at a specified position.
Definition: Array-base.cc:1608
bool isempty() const
Size of the specified dimension.
Definition: Array.h:651
char element_type
Definition: Array.h:230
const dim_vector & dims() const
Return a const-reference so that dims ()(i) works efficiently.
Definition: Array.h:503
Array< T, Alloc > diag(octave_idx_type k=0) const
Get the kth super or subdiagonal.
Definition: Array-base.cc:2541
octave_idx_type numel() const
Number of elements in the array.
Definition: Array.h:414
charNDArray concat(const charNDArray &rb, const Array< octave_idx_type > &ra_idx)
Definition: chNDArray.cc:103
charNDArray & insert(const charNDArray &a, octave_idx_type r, octave_idx_type c)
Definition: chNDArray.cc:166
charNDArray max(int dim=-1) const
Definition: chNDArray.cc:142
charNDArray min(int dim=-1) const
Definition: chNDArray.cc:154
boolNDArray any(int dim=-1) const
Definition: chNDArray.cc:97
static void increment_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions, int start_dimension=0)
Definition: chNDArray.cc:180
static octave_idx_type compute_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions)
Definition: chNDArray.cc:188
charNDArray diag(octave_idx_type k=0) const
Definition: chNDArray.cc:195
boolNDArray all(int dim=-1) const
Definition: chNDArray.cc:91
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:94
octave_idx_type nint_big(double x)
Definition: lo-mappers.cc:188
bool isnan(bool)
Definition: lo-mappers.h:178
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
void mx_inline_xmin(std::size_t n, T *r, const T *x, const T *y)
Definition: mx-inlines.cc:341
void mx_inline_any(const T *v, bool *r, octave_idx_type l, octave_idx_type n, octave_idx_type u)
Definition: mx-inlines.cc:859
Array< R > do_ms_binary_op(const Array< X > &x, const Y &y, void(*op)(std::size_t, R *, const X *, Y))
Definition: mx-inlines.cc:529
void mx_inline_max(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:980
void mx_inline_xmax(std::size_t n, T *r, const T *x, const T *y)
Definition: mx-inlines.cc:365
void mx_inline_all(const T *v, bool *r, octave_idx_type m, octave_idx_type n)
Definition: mx-inlines.cc:825
Array< R > do_mm_binary_op(const Array< X > &x, const Array< Y > &y, void(*op)(std::size_t, R *, const X *, const Y *), void(*op1)(std::size_t, R *, X, const Y *), void(*op2)(std::size_t, R *, const X *, Y), const char *opname)
Definition: mx-inlines.cc:505
void mx_inline_min(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:979
T octave_idx_type m
Definition: mx-inlines.cc:781
Array< R > do_sm_binary_op(const X &x, const Array< Y > &y, void(*op)(std::size_t, R *, X, const Y *))
Definition: mx-inlines.cc:539
octave_idx_type n
Definition: mx-inlines.cc:761
T * r
Definition: mx-inlines.cc:781
#define NDND_BOOL_OPS(ND1, ND2)
Definition: mx-op-defs.h:350
#define NDS_BOOL_OPS(ND, S)
Definition: mx-op-defs.h:256
#define NDND_CMP_OPS(ND1, ND2)
Definition: mx-op-defs.h:333
#define SND_BOOL_OPS(S, ND)
Definition: mx-op-defs.h:303
#define NDS_CMP_OPS(ND, S)
Definition: mx-op-defs.h:239
#define SND_CMP_OPS(S, ND)
Definition: mx-op-defs.h:286
T::size_type numel(const T &str)
Definition: oct-string.cc:74
T::size_type strlen(const typename T::value_type *str)
Definition: oct-string.cc:88
const octave_base_value const Array< octave_idx_type > & ra_idx