Mercurial > hg > octave-lyh
annotate liboctave/dNDArray.cc @ 9578:7dafdb8b062f
refactor comparison ops implementations
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Thu, 27 Aug 2009 11:19:33 +0200 |
parents | 0c72d9284087 |
children | a9b37bae1802 |
rev | line source |
---|---|
4513 | 1 // N-D Array manipulations. |
4511 | 2 /* |
3 | |
8920 | 4 Copyright (C) 1996, 1997, 2003, 2004, 2005, 2006, 2007, 2008, |
5 2009 John W. Eaton | |
4511 | 6 |
7 This file is part of Octave. | |
8 | |
9 Octave is free software; you can redistribute it and/or modify it | |
10 under the terms of the GNU General Public License as published by the | |
7016 | 11 Free Software Foundation; either version 3 of the License, or (at your |
12 option) any later version. | |
4511 | 13 |
14 Octave is distributed in the hope that it will be useful, but WITHOUT | |
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
7016 | 20 along with Octave; see the file COPYING. If not, see |
21 <http://www.gnu.org/licenses/>. | |
4511 | 22 |
23 */ | |
24 | |
25 #ifdef HAVE_CONFIG_H | |
26 #include <config.h> | |
27 #endif | |
28 | |
4634 | 29 #include <cfloat> |
5164 | 30 |
4780 | 31 #include <vector> |
4634 | 32 |
4588 | 33 #include "Array-util.h" |
4513 | 34 #include "dNDArray.h" |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9513
diff
changeset
|
35 #include "f77-fcn.h" |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
36 #include "functor.h" |
4513 | 37 #include "lo-error.h" |
4511 | 38 #include "lo-ieee.h" |
4634 | 39 #include "lo-mappers.h" |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9513
diff
changeset
|
40 #include "mx-base.h" |
8774
b756ce0002db
split implementation and interface in mx-op-defs and MArray-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
8751
diff
changeset
|
41 #include "mx-op-defs.h" |
4773 | 42 #include "oct-fftw.h" |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9513
diff
changeset
|
43 #include "oct-locbuf.h" |
4773 | 44 |
7919
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
45 NDArray::NDArray (const Array<octave_idx_type>& a, bool zero_based, |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
46 bool negative_to_nan) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
47 { |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
48 const octave_idx_type *pa = a.fortran_vec (); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
49 resize (a.dims ()); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
50 double *ptmp = fortran_vec (); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
51 if (negative_to_nan) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
52 { |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
53 double nan_val = lo_ieee_nan_value (); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
54 |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
55 if (zero_based) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
56 for (octave_idx_type i = 0; i < a.numel (); i++) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
57 { |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
58 double val = static_cast<double> |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
59 (pa[i] + static_cast<octave_idx_type> (1)); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
60 if (val <= 0) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
61 ptmp[i] = nan_val; |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
62 else |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
63 ptmp[i] = val; |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
64 } |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
65 else |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
66 for (octave_idx_type i = 0; i < a.numel (); i++) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
67 { |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
68 double val = static_cast<double> (pa[i]); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
69 if (val <= 0) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
70 ptmp[i] = nan_val; |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
71 else |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
72 ptmp[i] = val; |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
73 } |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
74 } |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
75 else |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
76 { |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
77 if (zero_based) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
78 for (octave_idx_type i = 0; i < a.numel (); i++) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
79 ptmp[i] = static_cast<double> |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
80 (pa[i] + static_cast<octave_idx_type> (1)); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
81 else |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
82 for (octave_idx_type i = 0; i < a.numel (); i++) |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
83 ptmp[i] = static_cast<double> (pa[i]); |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
84 } |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
85 } |
9d080df0c843
new NDArray constructor for ArrayN<octave_idx_type>
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
86 |
8956
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
87 NDArray::NDArray (const charNDArray& a) |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
88 : MArrayN<double> (a.dims ()) |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
89 { |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
90 octave_idx_type n = a.numel (); |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
91 for (octave_idx_type i = 0; i < n; i++) |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
92 xelem (i) = static_cast<unsigned char> (a(i)); |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
93 } |
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
94 |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9513
diff
changeset
|
95 #if defined (HAVE_FFTW) |
7941
f8cab9eeb128
Fix NDArray compilation/export
John W. Eaton <jwe@octave.org>
parents:
7922
diff
changeset
|
96 |
4773 | 97 ComplexNDArray |
98 NDArray::fourier (int dim) const | |
99 { | |
100 dim_vector dv = dims (); | |
101 | |
102 if (dim > dv.length () || dim < 0) | |
103 return ComplexNDArray (); | |
104 | |
5275 | 105 octave_idx_type stride = 1; |
106 octave_idx_type n = dv(dim); | |
4773 | 107 |
108 for (int i = 0; i < dim; i++) | |
109 stride *= dv(i); | |
110 | |
5275 | 111 octave_idx_type howmany = numel () / dv (dim); |
4773 | 112 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 113 octave_idx_type nloop = (stride == 1 ? 1 : numel () / dv (dim) / stride); |
114 octave_idx_type dist = (stride == 1 ? n : 1); | |
4773 | 115 |
116 const double *in (fortran_vec ()); | |
117 ComplexNDArray retval (dv); | |
118 Complex *out (retval.fortran_vec ()); | |
119 | |
120 // Need to be careful here about the distance between fft's | |
5275 | 121 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 122 octave_fftw::fft (in + k * stride * n, out + k * stride * n, |
123 n, howmany, stride, dist); | |
124 | |
125 return retval; | |
126 } | |
127 | |
128 ComplexNDArray | |
4816 | 129 NDArray::ifourier (int dim) const |
4773 | 130 { |
131 dim_vector dv = dims (); | |
132 | |
133 if (dim > dv.length () || dim < 0) | |
134 return ComplexNDArray (); | |
135 | |
5275 | 136 octave_idx_type stride = 1; |
137 octave_idx_type n = dv(dim); | |
4773 | 138 |
139 for (int i = 0; i < dim; i++) | |
140 stride *= dv(i); | |
141 | |
5275 | 142 octave_idx_type howmany = numel () / dv (dim); |
4773 | 143 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 144 octave_idx_type nloop = (stride == 1 ? 1 : numel () / dv (dim) / stride); |
145 octave_idx_type dist = (stride == 1 ? n : 1); | |
4773 | 146 |
147 ComplexNDArray retval (*this); | |
148 Complex *out (retval.fortran_vec ()); | |
149 | |
150 // Need to be careful here about the distance between fft's | |
5275 | 151 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 152 octave_fftw::ifft (out + k * stride * n, out + k * stride * n, |
153 n, howmany, stride, dist); | |
154 | |
155 return retval; | |
156 } | |
157 | |
158 ComplexNDArray | |
159 NDArray::fourier2d (void) const | |
160 { | |
161 dim_vector dv = dims(); | |
162 if (dv.length () < 2) | |
163 return ComplexNDArray (); | |
164 | |
165 dim_vector dv2(dv(0), dv(1)); | |
166 const double *in = fortran_vec (); | |
167 ComplexNDArray retval (dv); | |
168 Complex *out = retval.fortran_vec (); | |
5275 | 169 octave_idx_type howmany = numel() / dv(0) / dv(1); |
170 octave_idx_type dist = dv(0) * dv(1); | |
4773 | 171 |
5275 | 172 for (octave_idx_type i=0; i < howmany; i++) |
4773 | 173 octave_fftw::fftNd (in + i*dist, out + i*dist, 2, dv2); |
174 | |
175 return retval; | |
176 } | |
177 | |
178 ComplexNDArray | |
179 NDArray::ifourier2d (void) const | |
180 { | |
181 dim_vector dv = dims(); | |
182 if (dv.length () < 2) | |
183 return ComplexNDArray (); | |
184 | |
185 dim_vector dv2(dv(0), dv(1)); | |
186 ComplexNDArray retval (*this); | |
187 Complex *out = retval.fortran_vec (); | |
5275 | 188 octave_idx_type howmany = numel() / dv(0) / dv(1); |
189 octave_idx_type dist = dv(0) * dv(1); | |
4773 | 190 |
5275 | 191 for (octave_idx_type i=0; i < howmany; i++) |
4773 | 192 octave_fftw::ifftNd (out + i*dist, out + i*dist, 2, dv2); |
193 | |
194 return retval; | |
195 } | |
196 | |
197 ComplexNDArray | |
198 NDArray::fourierNd (void) const | |
199 { | |
200 dim_vector dv = dims (); | |
201 int rank = dv.length (); | |
202 | |
203 const double *in (fortran_vec ()); | |
204 ComplexNDArray retval (dv); | |
205 Complex *out (retval.fortran_vec ()); | |
206 | |
207 octave_fftw::fftNd (in, out, rank, dv); | |
208 | |
209 return retval; | |
210 } | |
211 | |
212 ComplexNDArray | |
213 NDArray::ifourierNd (void) const | |
214 { | |
215 dim_vector dv = dims (); | |
216 int rank = dv.length (); | |
217 | |
218 ComplexNDArray tmp (*this); | |
219 Complex *in (tmp.fortran_vec ()); | |
220 ComplexNDArray retval (dv); | |
221 Complex *out (retval.fortran_vec ()); | |
222 | |
223 octave_fftw::ifftNd (in, out, rank, dv); | |
224 | |
225 return retval; | |
226 } | |
227 | |
228 #else | |
229 | |
230 extern "C" | |
231 { | |
232 // Note that the original complex fft routines were not written for | |
233 // double complex arguments. They have been modified by adding an | |
234 // implicit double precision (a-h,o-z) statement at the beginning of | |
235 // each subroutine. | |
236 | |
237 F77_RET_T | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
238 F77_FUNC (zffti, ZFFTI) (const octave_idx_type&, Complex*); |
4773 | 239 |
240 F77_RET_T | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
241 F77_FUNC (zfftf, ZFFTF) (const octave_idx_type&, Complex*, Complex*); |
4773 | 242 |
243 F77_RET_T | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
244 F77_FUNC (zfftb, ZFFTB) (const octave_idx_type&, Complex*, Complex*); |
4773 | 245 } |
246 | |
247 ComplexNDArray | |
248 NDArray::fourier (int dim) const | |
249 { | |
250 dim_vector dv = dims (); | |
251 | |
252 if (dim > dv.length () || dim < 0) | |
253 return ComplexNDArray (); | |
254 | |
255 ComplexNDArray retval (dv); | |
5275 | 256 octave_idx_type npts = dv(dim); |
257 octave_idx_type nn = 4*npts+15; | |
4773 | 258 Array<Complex> wsave (nn); |
259 Complex *pwsave = wsave.fortran_vec (); | |
260 | |
261 OCTAVE_LOCAL_BUFFER (Complex, tmp, npts); | |
262 | |
5275 | 263 octave_idx_type stride = 1; |
4773 | 264 |
265 for (int i = 0; i < dim; i++) | |
266 stride *= dv(i); | |
267 | |
5275 | 268 octave_idx_type howmany = numel () / npts; |
4773 | 269 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 270 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
271 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 272 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
273 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 274 |
5275 | 275 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 276 { |
5275 | 277 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 278 { |
279 OCTAVE_QUIT; | |
280 | |
5275 | 281 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 282 tmp[i] = elem((i + k*npts)*stride + j*dist); |
283 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
284 F77_FUNC (zfftf, ZFFTF) (npts, tmp, pwsave); |
4773 | 285 |
5275 | 286 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 287 retval ((i + k*npts)*stride + j*dist) = tmp[i]; |
288 } | |
289 } | |
290 | |
291 return retval; | |
292 } | |
293 | |
294 ComplexNDArray | |
295 NDArray::ifourier (int dim) const | |
296 { | |
297 dim_vector dv = dims (); | |
298 | |
299 if (dim > dv.length () || dim < 0) | |
300 return ComplexNDArray (); | |
301 | |
302 ComplexNDArray retval (dv); | |
5275 | 303 octave_idx_type npts = dv(dim); |
304 octave_idx_type nn = 4*npts+15; | |
4773 | 305 Array<Complex> wsave (nn); |
306 Complex *pwsave = wsave.fortran_vec (); | |
307 | |
308 OCTAVE_LOCAL_BUFFER (Complex, tmp, npts); | |
309 | |
5275 | 310 octave_idx_type stride = 1; |
4773 | 311 |
312 for (int i = 0; i < dim; i++) | |
313 stride *= dv(i); | |
314 | |
5275 | 315 octave_idx_type howmany = numel () / npts; |
4773 | 316 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 317 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
318 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 319 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
320 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 321 |
5275 | 322 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 323 { |
5275 | 324 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 325 { |
326 OCTAVE_QUIT; | |
327 | |
5275 | 328 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 329 tmp[i] = elem((i + k*npts)*stride + j*dist); |
330 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
331 F77_FUNC (zfftb, ZFFTB) (npts, tmp, pwsave); |
4773 | 332 |
5275 | 333 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 334 retval ((i + k*npts)*stride + j*dist) = tmp[i] / |
335 static_cast<double> (npts); | |
336 } | |
337 } | |
338 | |
339 return retval; | |
340 } | |
341 | |
342 ComplexNDArray | |
343 NDArray::fourier2d (void) const | |
344 { | |
345 dim_vector dv = dims(); | |
346 dim_vector dv2 (dv(0), dv(1)); | |
347 int rank = 2; | |
348 ComplexNDArray retval (*this); | |
5275 | 349 octave_idx_type stride = 1; |
4773 | 350 |
351 for (int i = 0; i < rank; i++) | |
352 { | |
5275 | 353 octave_idx_type npts = dv2(i); |
354 octave_idx_type nn = 4*npts+15; | |
4773 | 355 Array<Complex> wsave (nn); |
356 Complex *pwsave = wsave.fortran_vec (); | |
357 Array<Complex> row (npts); | |
358 Complex *prow = row.fortran_vec (); | |
359 | |
5275 | 360 octave_idx_type howmany = numel () / npts; |
4773 | 361 howmany = (stride == 1 ? howmany : |
362 (howmany > stride ? stride : howmany)); | |
5275 | 363 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
364 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 365 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
366 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 367 |
5275 | 368 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 369 { |
5275 | 370 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 371 { |
372 OCTAVE_QUIT; | |
373 | |
5275 | 374 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 375 prow[l] = retval ((l + k*npts)*stride + j*dist); |
376 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
377 F77_FUNC (zfftf, ZFFTF) (npts, prow, pwsave); |
4773 | 378 |
5275 | 379 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 380 retval ((l + k*npts)*stride + j*dist) = prow[l]; |
381 } | |
382 } | |
383 | |
384 stride *= dv2(i); | |
385 } | |
386 | |
387 return retval; | |
388 } | |
389 | |
390 ComplexNDArray | |
391 NDArray::ifourier2d (void) const | |
392 { | |
393 dim_vector dv = dims(); | |
394 dim_vector dv2 (dv(0), dv(1)); | |
395 int rank = 2; | |
396 ComplexNDArray retval (*this); | |
5275 | 397 octave_idx_type stride = 1; |
4773 | 398 |
399 for (int i = 0; i < rank; i++) | |
400 { | |
5275 | 401 octave_idx_type npts = dv2(i); |
402 octave_idx_type nn = 4*npts+15; | |
4773 | 403 Array<Complex> wsave (nn); |
404 Complex *pwsave = wsave.fortran_vec (); | |
405 Array<Complex> row (npts); | |
406 Complex *prow = row.fortran_vec (); | |
407 | |
5275 | 408 octave_idx_type howmany = numel () / npts; |
4773 | 409 howmany = (stride == 1 ? howmany : |
410 (howmany > stride ? stride : howmany)); | |
5275 | 411 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
412 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 413 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
414 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 415 |
5275 | 416 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 417 { |
5275 | 418 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 419 { |
420 OCTAVE_QUIT; | |
421 | |
5275 | 422 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 423 prow[l] = retval ((l + k*npts)*stride + j*dist); |
424 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
425 F77_FUNC (zfftb, ZFFTB) (npts, prow, pwsave); |
4773 | 426 |
5275 | 427 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 428 retval ((l + k*npts)*stride + j*dist) = prow[l] / |
429 static_cast<double> (npts); | |
430 } | |
431 } | |
432 | |
433 stride *= dv2(i); | |
434 } | |
435 | |
436 return retval; | |
437 } | |
438 | |
439 ComplexNDArray | |
440 NDArray::fourierNd (void) const | |
441 { | |
442 dim_vector dv = dims (); | |
443 int rank = dv.length (); | |
444 ComplexNDArray retval (*this); | |
5275 | 445 octave_idx_type stride = 1; |
4773 | 446 |
447 for (int i = 0; i < rank; i++) | |
448 { | |
5275 | 449 octave_idx_type npts = dv(i); |
450 octave_idx_type nn = 4*npts+15; | |
4773 | 451 Array<Complex> wsave (nn); |
452 Complex *pwsave = wsave.fortran_vec (); | |
453 Array<Complex> row (npts); | |
454 Complex *prow = row.fortran_vec (); | |
455 | |
5275 | 456 octave_idx_type howmany = numel () / npts; |
4773 | 457 howmany = (stride == 1 ? howmany : |
458 (howmany > stride ? stride : howmany)); | |
5275 | 459 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
460 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 461 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
462 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 463 |
5275 | 464 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 465 { |
5275 | 466 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 467 { |
468 OCTAVE_QUIT; | |
469 | |
5275 | 470 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 471 prow[l] = retval ((l + k*npts)*stride + j*dist); |
472 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
473 F77_FUNC (zfftf, ZFFTF) (npts, prow, pwsave); |
4773 | 474 |
5275 | 475 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 476 retval ((l + k*npts)*stride + j*dist) = prow[l]; |
477 } | |
478 } | |
479 | |
480 stride *= dv(i); | |
481 } | |
482 | |
483 return retval; | |
484 } | |
485 | |
486 ComplexNDArray | |
487 NDArray::ifourierNd (void) const | |
488 { | |
489 dim_vector dv = dims (); | |
490 int rank = dv.length (); | |
491 ComplexNDArray retval (*this); | |
5275 | 492 octave_idx_type stride = 1; |
4773 | 493 |
494 for (int i = 0; i < rank; i++) | |
495 { | |
5275 | 496 octave_idx_type npts = dv(i); |
497 octave_idx_type nn = 4*npts+15; | |
4773 | 498 Array<Complex> wsave (nn); |
499 Complex *pwsave = wsave.fortran_vec (); | |
500 Array<Complex> row (npts); | |
501 Complex *prow = row.fortran_vec (); | |
502 | |
5275 | 503 octave_idx_type howmany = numel () / npts; |
4773 | 504 howmany = (stride == 1 ? howmany : |
505 (howmany > stride ? stride : howmany)); | |
5275 | 506 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
507 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 508 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
509 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 510 |
5275 | 511 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 512 { |
5275 | 513 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 514 { |
515 OCTAVE_QUIT; | |
516 | |
5275 | 517 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 518 prow[l] = retval ((l + k*npts)*stride + j*dist); |
519 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
520 F77_FUNC (zfftb, ZFFTB) (npts, prow, pwsave); |
4773 | 521 |
5275 | 522 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 523 retval ((l + k*npts)*stride + j*dist) = prow[l] / |
524 static_cast<double> (npts); | |
525 } | |
526 } | |
527 | |
528 stride *= dv(i); | |
529 } | |
530 | |
531 return retval; | |
532 } | |
533 | |
534 #endif | |
535 | |
4543 | 536 // unary operations |
537 | |
538 boolNDArray | |
539 NDArray::operator ! (void) const | |
540 { | |
9553
0c72d9284087
further bool ops tweaks
Jaroslav Hajek <highegg@gmail.com>
parents:
9551
diff
changeset
|
541 return do_mx_unary_op<boolNDArray, NDArray> (*this, mx_inline_not); |
4543 | 542 } |
543 | |
4634 | 544 bool |
545 NDArray::any_element_is_negative (bool neg_zero) const | |
546 { | |
5275 | 547 octave_idx_type nel = nelem (); |
4634 | 548 |
549 if (neg_zero) | |
550 { | |
5275 | 551 for (octave_idx_type i = 0; i < nel; i++) |
4634 | 552 if (lo_ieee_signbit (elem (i))) |
553 return true; | |
554 } | |
555 else | |
556 { | |
5275 | 557 for (octave_idx_type i = 0; i < nel; i++) |
4634 | 558 if (elem (i) < 0) |
559 return true; | |
560 } | |
561 | |
562 return false; | |
563 } | |
564 | |
7922
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
565 bool |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
566 NDArray::any_element_is_nan (void) const |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
567 { |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
568 octave_idx_type nel = nelem (); |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
569 |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
570 for (octave_idx_type i = 0; i < nel; i++) |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
571 { |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
572 double val = elem (i); |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
573 if (xisnan (val)) |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
574 return true; |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
575 } |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
576 |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
577 return false; |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7919
diff
changeset
|
578 } |
4634 | 579 |
580 bool | |
581 NDArray::any_element_is_inf_or_nan (void) const | |
582 { | |
5275 | 583 octave_idx_type nel = nelem (); |
4634 | 584 |
5275 | 585 for (octave_idx_type i = 0; i < nel; i++) |
4634 | 586 { |
587 double val = elem (i); | |
588 if (xisinf (val) || xisnan (val)) | |
589 return true; | |
590 } | |
591 | |
592 return false; | |
593 } | |
594 | |
595 bool | |
5943 | 596 NDArray::any_element_not_one_or_zero (void) const |
597 { | |
598 octave_idx_type nel = nelem (); | |
599 | |
600 for (octave_idx_type i = 0; i < nel; i++) | |
601 { | |
602 double val = elem (i); | |
603 if (val != 0 && val != 1) | |
604 return true; | |
605 } | |
606 | |
607 return false; | |
608 } | |
609 | |
610 bool | |
6989 | 611 NDArray::all_elements_are_zero (void) const |
612 { | |
613 octave_idx_type nel = nelem (); | |
614 | |
615 for (octave_idx_type i = 0; i < nel; i++) | |
616 if (elem (i) != 0) | |
617 return false; | |
618 | |
619 return true; | |
620 } | |
621 | |
622 bool | |
4634 | 623 NDArray::all_elements_are_int_or_inf_or_nan (void) const |
624 { | |
5275 | 625 octave_idx_type nel = nelem (); |
4634 | 626 |
5275 | 627 for (octave_idx_type i = 0; i < nel; i++) |
4634 | 628 { |
629 double val = elem (i); | |
630 if (xisnan (val) || D_NINT (val) == val) | |
631 continue; | |
632 else | |
633 return false; | |
634 } | |
635 | |
636 return true; | |
637 } | |
638 | |
639 // Return nonzero if any element of M is not an integer. Also extract | |
640 // the largest and smallest values and return them in MAX_VAL and MIN_VAL. | |
641 | |
642 bool | |
643 NDArray::all_integers (double& max_val, double& min_val) const | |
644 { | |
5275 | 645 octave_idx_type nel = nelem (); |
4634 | 646 |
647 if (nel > 0) | |
648 { | |
649 max_val = elem (0); | |
650 min_val = elem (0); | |
651 } | |
652 else | |
653 return false; | |
654 | |
5275 | 655 for (octave_idx_type i = 0; i < nel; i++) |
4634 | 656 { |
657 double val = elem (i); | |
658 | |
659 if (val > max_val) | |
660 max_val = val; | |
661 | |
662 if (val < min_val) | |
663 min_val = val; | |
664 | |
665 if (D_NINT (val) != val) | |
666 return false; | |
667 } | |
668 | |
669 return true; | |
670 } | |
671 | |
672 bool | |
673 NDArray::too_large_for_float (void) const | |
674 { | |
5275 | 675 octave_idx_type nel = nelem (); |
4634 | 676 |
5275 | 677 for (octave_idx_type i = 0; i < nel; i++) |
4634 | 678 { |
679 double val = elem (i); | |
680 | |
5389 | 681 if (! (xisnan (val) || xisinf (val)) |
5387 | 682 && fabs (val) > FLT_MAX) |
4634 | 683 return true; |
684 } | |
685 | |
686 return false; | |
687 } | |
688 | |
5775 | 689 // FIXME -- this is not quite the right thing. |
4513 | 690 |
4556 | 691 boolNDArray |
4513 | 692 NDArray::all (int dim) const |
693 { | |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
694 return do_mx_red_op<boolNDArray, double> (*this, dim, mx_inline_all); |
4513 | 695 } |
696 | |
4556 | 697 boolNDArray |
4513 | 698 NDArray::any (int dim) const |
699 { | |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
700 return do_mx_red_op<boolNDArray, double> (*this, dim, mx_inline_any); |
4569 | 701 } |
702 | |
4584 | 703 NDArray |
4569 | 704 NDArray::cumprod (int dim) const |
705 { | |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
706 return do_mx_cum_op<NDArray, double> (*this, dim, mx_inline_cumprod); |
4569 | 707 } |
708 | |
4584 | 709 NDArray |
4569 | 710 NDArray::cumsum (int dim) const |
711 { | |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
712 return do_mx_cum_op<NDArray, double> (*this, dim, mx_inline_cumsum); |
4513 | 713 } |
714 | |
4569 | 715 NDArray |
716 NDArray::prod (int dim) const | |
717 { | |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
718 return do_mx_red_op<NDArray, double> (*this, dim, mx_inline_prod); |
8736
53b4fdeacc2e
improve reduction functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8650
diff
changeset
|
719 } |
53b4fdeacc2e
improve reduction functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8650
diff
changeset
|
720 |
53b4fdeacc2e
improve reduction functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8650
diff
changeset
|
721 NDArray |
53b4fdeacc2e
improve reduction functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8650
diff
changeset
|
722 NDArray::sum (int dim) const |
53b4fdeacc2e
improve reduction functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8650
diff
changeset
|
723 { |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
724 return do_mx_red_op<NDArray, double> (*this, dim, mx_inline_sum); |
4569 | 725 } |
726 | |
727 NDArray | |
728 NDArray::sumsq (int dim) const | |
729 { | |
9227
8145f2255276
use explicit template qualifs to please Intel C++ and MSVC++
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
730 return do_mx_red_op<NDArray, double> (*this, dim, mx_inline_sumsq); |
4569 | 731 } |
732 | |
4844 | 733 NDArray |
734 NDArray::max (int dim) const | |
735 { | |
8751
9f7ce4bf7650
optimize min/max functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8743
diff
changeset
|
736 return do_mx_minmax_op<NDArray> (*this, dim, mx_inline_max); |
4844 | 737 } |
738 | |
739 NDArray | |
5275 | 740 NDArray::max (ArrayN<octave_idx_type>& idx_arg, int dim) const |
4844 | 741 { |
8751
9f7ce4bf7650
optimize min/max functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8743
diff
changeset
|
742 return do_mx_minmax_op<NDArray> (*this, idx_arg, dim, mx_inline_max); |
4844 | 743 } |
744 | |
745 NDArray | |
746 NDArray::min (int dim) const | |
747 { | |
8751
9f7ce4bf7650
optimize min/max functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8743
diff
changeset
|
748 return do_mx_minmax_op<NDArray> (*this, dim, mx_inline_min); |
4844 | 749 } |
750 | |
751 NDArray | |
5275 | 752 NDArray::min (ArrayN<octave_idx_type>& idx_arg, int dim) const |
4844 | 753 { |
8751
9f7ce4bf7650
optimize min/max functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8743
diff
changeset
|
754 return do_mx_minmax_op<NDArray> (*this, idx_arg, dim, mx_inline_min); |
4844 | 755 } |
756 | |
4915 | 757 NDArray |
8777
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
758 NDArray::cummax (int dim) const |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
759 { |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
760 return do_mx_cumminmax_op<NDArray> (*this, dim, mx_inline_cummax); |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
761 } |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
762 |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
763 NDArray |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
764 NDArray::cummax (ArrayN<octave_idx_type>& idx_arg, int dim) const |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
765 { |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
766 return do_mx_cumminmax_op<NDArray> (*this, idx_arg, dim, mx_inline_cummax); |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
767 } |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
768 |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
769 NDArray |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
770 NDArray::cummin (int dim) const |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
771 { |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
772 return do_mx_cumminmax_op<NDArray> (*this, dim, mx_inline_cummin); |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
773 } |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
774 |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
775 NDArray |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
776 NDArray::cummin (ArrayN<octave_idx_type>& idx_arg, int dim) const |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
777 { |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
778 return do_mx_cumminmax_op<NDArray> (*this, idx_arg, dim, mx_inline_cummin); |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
779 } |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
780 |
724c0f46d9d4
implement cummin/cummax functions
Jaroslav Hajek <highegg@gmail.com>
parents:
8774
diff
changeset
|
781 NDArray |
9513
9f870f73ab7d
implement built-in diff
Jaroslav Hajek <highegg@gmail.com>
parents:
9469
diff
changeset
|
782 NDArray::diff (octave_idx_type order, int dim) const |
9f870f73ab7d
implement built-in diff
Jaroslav Hajek <highegg@gmail.com>
parents:
9469
diff
changeset
|
783 { |
9f870f73ab7d
implement built-in diff
Jaroslav Hajek <highegg@gmail.com>
parents:
9469
diff
changeset
|
784 return do_mx_diff_op<NDArray> (*this, dim, order, mx_inline_diff); |
9f870f73ab7d
implement built-in diff
Jaroslav Hajek <highegg@gmail.com>
parents:
9469
diff
changeset
|
785 } |
9f870f73ab7d
implement built-in diff
Jaroslav Hajek <highegg@gmail.com>
parents:
9469
diff
changeset
|
786 |
9f870f73ab7d
implement built-in diff
Jaroslav Hajek <highegg@gmail.com>
parents:
9469
diff
changeset
|
787 NDArray |
5275 | 788 NDArray::concat (const NDArray& rb, const Array<octave_idx_type>& ra_idx) |
4758 | 789 { |
5073 | 790 if (rb.numel () > 0) |
791 insert (rb, ra_idx); | |
792 return *this; | |
793 } | |
794 | |
795 ComplexNDArray | |
5275 | 796 NDArray::concat (const ComplexNDArray& rb, const Array<octave_idx_type>& ra_idx) |
5073 | 797 { |
798 ComplexNDArray retval (*this); | |
4940 | 799 if (rb.numel () > 0) |
4915 | 800 retval.insert (rb, ra_idx); |
801 return retval; | |
4758 | 802 } |
803 | |
5073 | 804 charNDArray |
5275 | 805 NDArray::concat (const charNDArray& rb, const Array<octave_idx_type>& ra_idx) |
5073 | 806 { |
807 charNDArray retval (dims ()); | |
5275 | 808 octave_idx_type nel = numel (); |
5073 | 809 |
5275 | 810 for (octave_idx_type i = 0; i < nel; i++) |
5073 | 811 { |
812 double d = elem (i); | |
813 | |
814 if (xisnan (d)) | |
815 { | |
816 (*current_liboctave_error_handler) | |
817 ("invalid conversion from NaN to character"); | |
818 return retval; | |
819 } | |
820 else | |
821 { | |
5275 | 822 octave_idx_type ival = NINTbig (d); |
5073 | 823 |
824 if (ival < 0 || ival > UCHAR_MAX) | |
5775 | 825 // FIXME -- is there something |
5073 | 826 // better we could do? Should we warn the user? |
827 ival = 0; | |
828 | |
829 retval.elem (i) = static_cast<char>(ival); | |
830 } | |
831 } | |
832 | |
833 if (rb.numel () == 0) | |
834 return retval; | |
835 | |
836 retval.insert (rb, ra_idx); | |
837 return retval; | |
838 } | |
839 | |
4634 | 840 NDArray |
841 real (const ComplexNDArray& a) | |
842 { | |
8650
a1ae2aae903e
abs,real,imag,conj: use code from mx-inlines rather than the generic map
Jaroslav Hajek <highegg@gmail.com>
parents:
8377
diff
changeset
|
843 return NDArray (mx_inline_real_dup (a.data (), a.length ()), |
a1ae2aae903e
abs,real,imag,conj: use code from mx-inlines rather than the generic map
Jaroslav Hajek <highegg@gmail.com>
parents:
8377
diff
changeset
|
844 a.dims ()); |
4634 | 845 } |
846 | |
847 NDArray | |
848 imag (const ComplexNDArray& a) | |
849 { | |
8650
a1ae2aae903e
abs,real,imag,conj: use code from mx-inlines rather than the generic map
Jaroslav Hajek <highegg@gmail.com>
parents:
8377
diff
changeset
|
850 return NDArray (mx_inline_imag_dup (a.data (), a.length ()), |
a1ae2aae903e
abs,real,imag,conj: use code from mx-inlines rather than the generic map
Jaroslav Hajek <highegg@gmail.com>
parents:
8377
diff
changeset
|
851 a.dims ()); |
4634 | 852 } |
853 | |
4915 | 854 NDArray& |
5275 | 855 NDArray::insert (const NDArray& a, octave_idx_type r, octave_idx_type c) |
4915 | 856 { |
857 Array<double>::insert (a, r, c); | |
858 return *this; | |
859 } | |
860 | |
861 NDArray& | |
5275 | 862 NDArray::insert (const NDArray& a, const Array<octave_idx_type>& ra_idx) |
4915 | 863 { |
864 Array<double>::insert (a, ra_idx); | |
865 return *this; | |
866 } | |
867 | |
4634 | 868 NDArray |
4569 | 869 NDArray::abs (void) const |
870 { | |
8650
a1ae2aae903e
abs,real,imag,conj: use code from mx-inlines rather than the generic map
Jaroslav Hajek <highegg@gmail.com>
parents:
8377
diff
changeset
|
871 return NDArray (mx_inline_fabs_dup (data (), length ()), |
a1ae2aae903e
abs,real,imag,conj: use code from mx-inlines rather than the generic map
Jaroslav Hajek <highegg@gmail.com>
parents:
8377
diff
changeset
|
872 dims ()); |
4569 | 873 } |
874 | |
8998
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
875 boolNDArray |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
876 NDArray::isnan (void) const |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
877 { |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
878 return ArrayN<bool> (fastmap<bool> (xisnan)); |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
879 } |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
880 |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
881 boolNDArray |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
882 NDArray::isinf (void) const |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
883 { |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
884 return ArrayN<bool> (fastmap<bool> (xisinf)); |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
885 } |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
886 |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
887 boolNDArray |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
888 NDArray::isfinite (void) const |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
889 { |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
890 return ArrayN<bool> (fastmap<bool> (xfinite)); |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
891 } |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8981
diff
changeset
|
892 |
4532 | 893 Matrix |
894 NDArray::matrix_value (void) const | |
895 { | |
896 Matrix retval; | |
897 | |
8981
ed5055b0a476
fix & simplify ndarray->matrix conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8956
diff
changeset
|
898 if (ndims () == 2) |
ed5055b0a476
fix & simplify ndarray->matrix conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8956
diff
changeset
|
899 retval = Matrix (Array2<double> (*this)); |
ed5055b0a476
fix & simplify ndarray->matrix conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8956
diff
changeset
|
900 else |
ed5055b0a476
fix & simplify ndarray->matrix conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8956
diff
changeset
|
901 (*current_liboctave_error_handler) |
ed5055b0a476
fix & simplify ndarray->matrix conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8956
diff
changeset
|
902 ("invalid conversion of NDArray to Matrix"); |
4532 | 903 |
904 return retval; | |
905 } | |
906 | |
907 void | |
5275 | 908 NDArray::increment_index (Array<octave_idx_type>& ra_idx, |
4532 | 909 const dim_vector& dimensions, |
910 int start_dimension) | |
911 { | |
912 ::increment_index (ra_idx, dimensions, start_dimension); | |
913 } | |
914 | |
5275 | 915 octave_idx_type |
916 NDArray::compute_index (Array<octave_idx_type>& ra_idx, | |
4556 | 917 const dim_vector& dimensions) |
918 { | |
919 return ::compute_index (ra_idx, dimensions); | |
920 } | |
921 | |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
922 NDArray |
7620
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
923 NDArray::diag (octave_idx_type k) const |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
924 { |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
925 return MArrayN<double>::diag (k); |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
926 } |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
927 |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
928 NDArray |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
929 NDArray::map (dmapper fcn) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
930 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
931 return MArrayN<double>::map<double> (func_ptr (fcn)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
932 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
933 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
934 ComplexNDArray |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
935 NDArray::map (cmapper fcn) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
936 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
937 return MArrayN<double>::map<Complex> (func_ptr (fcn)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
938 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
939 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
940 boolNDArray |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
941 NDArray::map (bmapper fcn) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
942 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
943 return MArrayN<double>::map<bool> (func_ptr (fcn)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
944 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
945 |
4687 | 946 // This contains no information on the array structure !!! |
947 std::ostream& | |
948 operator << (std::ostream& os, const NDArray& a) | |
949 { | |
5275 | 950 octave_idx_type nel = a.nelem (); |
4687 | 951 |
5275 | 952 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 953 { |
954 os << " "; | |
955 octave_write_double (os, a.elem (i)); | |
956 os << "\n"; | |
957 } | |
958 return os; | |
959 } | |
960 | |
961 std::istream& | |
962 operator >> (std::istream& is, NDArray& a) | |
963 { | |
5275 | 964 octave_idx_type nel = a.nelem (); |
4687 | 965 |
8999
dc07bc4157b8
allow empty matrices in stream input operators
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
966 if (nel > 0) |
4687 | 967 { |
968 double tmp; | |
5275 | 969 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 970 { |
9469
c6edba80dfae
sanity checks for loading sparse matrices
John W. Eaton <jwe@octave.org>
parents:
9227
diff
changeset
|
971 tmp = octave_read_value<double> (is); |
4687 | 972 if (is) |
973 a.elem (i) = tmp; | |
974 else | |
975 goto done; | |
976 } | |
977 } | |
978 | |
979 done: | |
980 | |
981 return is; | |
982 } | |
983 | |
5775 | 984 // FIXME -- it would be nice to share code among the min/max |
4844 | 985 // functions below. |
986 | |
987 #define EMPTY_RETURN_CHECK(T) \ | |
988 if (nel == 0) \ | |
989 return T (dv); | |
990 | |
991 NDArray | |
992 min (double d, const NDArray& m) | |
993 { | |
994 dim_vector dv = m.dims (); | |
5275 | 995 octave_idx_type nel = dv.numel (); |
4844 | 996 |
997 EMPTY_RETURN_CHECK (NDArray); | |
998 | |
999 NDArray result (dv); | |
1000 | |
5275 | 1001 for (octave_idx_type i = 0; i < nel; i++) |
4844 | 1002 { |
1003 OCTAVE_QUIT; | |
1004 result (i) = xmin (d, m (i)); | |
1005 } | |
1006 | |
1007 return result; | |
1008 } | |
1009 | |
1010 NDArray | |
1011 min (const NDArray& m, double d) | |
1012 { | |
1013 dim_vector dv = m.dims (); | |
5275 | 1014 octave_idx_type nel = dv.numel (); |
4844 | 1015 |
1016 EMPTY_RETURN_CHECK (NDArray); | |
1017 | |
1018 NDArray result (dv); | |
1019 | |
5275 | 1020 for (octave_idx_type i = 0; i < nel; i++) |
4844 | 1021 { |
1022 OCTAVE_QUIT; | |
1023 result (i) = xmin (d, m (i)); | |
1024 } | |
1025 | |
1026 return result; | |
1027 } | |
1028 | |
1029 NDArray | |
1030 min (const NDArray& a, const NDArray& b) | |
1031 { | |
1032 dim_vector dv = a.dims (); | |
5275 | 1033 octave_idx_type nel = dv.numel (); |
4844 | 1034 |
1035 if (dv != b.dims ()) | |
1036 { | |
1037 (*current_liboctave_error_handler) | |
1038 ("two-arg min expecting args of same size"); | |
1039 return NDArray (); | |
1040 } | |
1041 | |
1042 EMPTY_RETURN_CHECK (NDArray); | |
1043 | |
1044 NDArray result (dv); | |
1045 | |
5275 | 1046 for (octave_idx_type i = 0; i < nel; i++) |
4844 | 1047 { |
1048 OCTAVE_QUIT; | |
1049 result (i) = xmin (a (i), b (i)); | |
1050 } | |
1051 | |
1052 return result; | |
1053 } | |
1054 | |
1055 NDArray | |
1056 max (double d, const NDArray& m) | |
1057 { | |
1058 dim_vector dv = m.dims (); | |
5275 | 1059 octave_idx_type nel = dv.numel (); |
4844 | 1060 |
1061 EMPTY_RETURN_CHECK (NDArray); | |
1062 | |
1063 NDArray result (dv); | |
1064 | |
5275 | 1065 for (octave_idx_type i = 0; i < nel; i++) |
4844 | 1066 { |
1067 OCTAVE_QUIT; | |
1068 result (i) = xmax (d, m (i)); | |
1069 } | |
1070 | |
1071 return result; | |
1072 } | |
1073 | |
1074 NDArray | |
1075 max (const NDArray& m, double d) | |
1076 { | |
1077 dim_vector dv = m.dims (); | |
5275 | 1078 octave_idx_type nel = dv.numel (); |
4844 | 1079 |
1080 EMPTY_RETURN_CHECK (NDArray); | |
1081 | |
1082 NDArray result (dv); | |
1083 | |
5275 | 1084 for (octave_idx_type i = 0; i < nel; i++) |
4844 | 1085 { |
1086 OCTAVE_QUIT; | |
1087 result (i) = xmax (d, m (i)); | |
1088 } | |
1089 | |
1090 return result; | |
1091 } | |
1092 | |
1093 NDArray | |
1094 max (const NDArray& a, const NDArray& b) | |
1095 { | |
1096 dim_vector dv = a.dims (); | |
5275 | 1097 octave_idx_type nel = dv.numel (); |
4844 | 1098 |
1099 if (dv != b.dims ()) | |
1100 { | |
1101 (*current_liboctave_error_handler) | |
1102 ("two-arg max expecting args of same size"); | |
1103 return NDArray (); | |
1104 } | |
1105 | |
1106 EMPTY_RETURN_CHECK (NDArray); | |
1107 | |
1108 NDArray result (dv); | |
1109 | |
5275 | 1110 for (octave_idx_type i = 0; i < nel; i++) |
4844 | 1111 { |
1112 OCTAVE_QUIT; | |
1113 result (i) = xmax (a (i), b (i)); | |
1114 } | |
1115 | |
1116 return result; | |
1117 } | |
1118 | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
1119 NDS_CMP_OPS (NDArray, double) |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9523
diff
changeset
|
1120 NDS_BOOL_OPS (NDArray, double) |
4543 | 1121 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
1122 SND_CMP_OPS (double, NDArray) |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9523
diff
changeset
|
1123 SND_BOOL_OPS (double, NDArray) |
4543 | 1124 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
1125 NDND_CMP_OPS (NDArray, NDArray) |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9523
diff
changeset
|
1126 NDND_BOOL_OPS (NDArray, NDArray) |
4543 | 1127 |
4513 | 1128 /* |
1129 ;;; Local Variables: *** | |
1130 ;;; mode: C++ *** | |
1131 ;;; End: *** | |
1132 */ |