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