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