Mercurial > hg > octave-nkf
annotate src/ov-re-sparse.cc @ 12121:87237a866c71 release-3-2-x
this branch is no longer maintained and is closed for further development
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 22 Jan 2011 01:00:54 -0500 |
parents | 3df527f71cee |
children |
rev | line source |
---|---|
5164 | 1 /* |
2 | |
8920 | 3 Copyright (C) 2004, 2005, 2006, 2007, 2008 David Bateman |
7016 | 4 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Andy Adler |
5 | |
6 This file is part of Octave. | |
5164 | 7 |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
5164 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
5164 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
28 #include <climits> | |
29 | |
30 #include <iostream> | |
31 #include <vector> | |
32 | |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
33 #include "lo-specfun.h" |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
34 #include "lo-mappers.h" |
8377
25bc2d31e1bf
improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
7922
diff
changeset
|
35 #include "oct-locbuf.h" |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
36 |
5164 | 37 #include "ov-base.h" |
38 #include "ov-scalar.h" | |
39 #include "gripes.h" | |
40 | |
41 #include "ls-hdf5.h" | |
42 | |
43 #include "ov-re-sparse.h" | |
44 | |
45 #include "ov-base-sparse.h" | |
46 #include "ov-base-sparse.cc" | |
47 | |
48 #include "ov-bool-sparse.h" | |
49 | |
6109 | 50 template class OCTINTERP_API octave_base_sparse<SparseMatrix>; |
5164 | 51 |
52 DEFINE_OCTAVE_ALLOCATOR (octave_sparse_matrix); | |
53 | |
6823 | 54 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_matrix, "sparse matrix", "double"); |
5164 | 55 |
5282 | 56 idx_vector |
57 octave_sparse_matrix::index_vector (void) const | |
58 { | |
5604 | 59 if (matrix.numel () == matrix.nnz ()) |
5282 | 60 return idx_vector (array_value ()); |
61 else | |
62 { | |
63 std::string nm = type_name (); | |
64 error ("%s type invalid as index value", nm.c_str ()); | |
65 return idx_vector (); | |
66 } | |
67 } | |
68 | |
5759 | 69 octave_base_value * |
5164 | 70 octave_sparse_matrix::try_narrowing_conversion (void) |
71 { | |
5759 | 72 octave_base_value *retval = 0; |
5164 | 73 |
7193 | 74 if (Vsparse_auto_mutate) |
5164 | 75 { |
7193 | 76 // Don't use numel, since it can overflow for very large matrices |
77 // Note that for the second test, this means it becomes approximative | |
78 // since it involves a cast to double to avoid issues of overflow | |
79 if (matrix.rows () == 1 && matrix.cols () == 1) | |
80 { | |
81 // Const copy of the matrix, so the right version of () operator used | |
82 const SparseMatrix tmp (matrix); | |
5164 | 83 |
7193 | 84 retval = new octave_scalar (tmp (0)); |
85 } | |
86 else if (matrix.cols () > 0 && matrix.rows () > 0 && | |
87 double (matrix.byte_size ()) > double (matrix.rows ()) * | |
88 double (matrix.cols ()) * sizeof (double)) | |
89 retval = new octave_matrix (matrix.matrix_value ()); | |
5164 | 90 } |
91 | |
92 return retval; | |
93 } | |
94 | |
95 double | |
96 octave_sparse_matrix::double_value (bool) const | |
97 { | |
98 double retval = lo_ieee_nan_value (); | |
99 | |
100 if (numel () > 0) | |
101 { | |
6221 | 102 if (numel () > 1) |
103 gripe_implicit_conversion ("Octave:array-as-scalar", | |
104 "real sparse matrix", "real scalar"); | |
5164 | 105 |
106 retval = matrix (0, 0); | |
107 } | |
108 else | |
109 gripe_invalid_conversion ("real sparse matrix", "real scalar"); | |
110 | |
111 return retval; | |
112 } | |
113 | |
114 Complex | |
115 octave_sparse_matrix::complex_value (bool) const | |
116 { | |
117 double tmp = lo_ieee_nan_value (); | |
118 | |
119 Complex retval (tmp, tmp); | |
120 | |
5775 | 121 // FIXME -- maybe this should be a function, valid_as_scalar() |
5164 | 122 if (rows () > 0 && columns () > 0) |
123 { | |
6221 | 124 if (numel () > 1) |
125 gripe_implicit_conversion ("Octave:array-as-scalar", | |
126 "real sparse matrix", "complex scalar"); | |
5164 | 127 |
128 retval = matrix (0, 0); | |
129 } | |
130 else | |
131 gripe_invalid_conversion ("real sparse matrix", "complex scalar"); | |
132 | |
133 return retval; | |
134 } | |
135 | |
136 Matrix | |
137 octave_sparse_matrix::matrix_value (bool) const | |
138 { | |
139 return matrix.matrix_value (); | |
140 } | |
141 | |
5898 | 142 boolNDArray |
5943 | 143 octave_sparse_matrix::bool_array_value (bool warn) const |
5898 | 144 { |
5943 | 145 NDArray m = matrix.matrix_value (); |
146 | |
7922
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7885
diff
changeset
|
147 if (m.any_element_is_nan ()) |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7885
diff
changeset
|
148 error ("invalid conversion from NaN to logical"); |
935be827eaf8
error for NaN values in & and | expressions
John W. Eaton <jwe@octave.org>
parents:
7885
diff
changeset
|
149 else if (warn && m.any_element_not_one_or_zero ()) |
5943 | 150 gripe_logical_conversion (); |
151 | |
152 return boolNDArray (m); | |
5898 | 153 } |
154 | |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
155 charNDArray |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
156 octave_sparse_matrix::char_array_value (bool) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
157 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
158 charNDArray retval (dims (), 0); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
159 octave_idx_type nc = matrix.cols (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
160 octave_idx_type nr = matrix.rows (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
161 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
162 for (octave_idx_type j = 0; j < nc; j++) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
163 for (octave_idx_type i = matrix.cidx(j); i < matrix.cidx(j+1); i++) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
164 retval(matrix.ridx(i) + nr * j) = static_cast<char>(matrix.data (i)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
165 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
166 return retval; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
167 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
168 |
5164 | 169 ComplexMatrix |
170 octave_sparse_matrix::complex_matrix_value (bool) const | |
171 { | |
172 return ComplexMatrix (matrix.matrix_value ()); | |
173 } | |
174 | |
175 ComplexNDArray | |
176 octave_sparse_matrix::complex_array_value (bool) const | |
177 { | |
178 return ComplexNDArray (ComplexMatrix (matrix.matrix_value ())); | |
179 } | |
180 | |
181 NDArray | |
182 octave_sparse_matrix::array_value (bool) const | |
183 { | |
184 return NDArray (matrix.matrix_value ()); | |
185 } | |
186 | |
5282 | 187 octave_value |
5322 | 188 octave_sparse_matrix::convert_to_str_internal (bool, bool, char type) const |
5282 | 189 { |
190 octave_value retval; | |
191 dim_vector dv = dims (); | |
192 octave_idx_type nel = dv.numel (); | |
193 | |
194 if (nel == 0) | |
195 { | |
196 char s = '\0'; | |
5322 | 197 retval = octave_value (&s, type); |
5282 | 198 } |
199 else | |
200 { | |
201 octave_idx_type nr = matrix.rows (); | |
202 octave_idx_type nc = matrix.cols (); | |
203 charNDArray chm (dv, static_cast<char> (0)); | |
204 | |
205 bool warned = false; | |
206 | |
207 for (octave_idx_type j = 0; j < nc; j++) | |
208 for (octave_idx_type i = matrix.cidx(j); | |
209 i < matrix.cidx(j+1); i++) | |
210 { | |
211 OCTAVE_QUIT; | |
212 | |
213 double d = matrix.data (i); | |
214 | |
215 if (xisnan (d)) | |
216 { | |
217 ::error ("invalid conversion from NaN to character"); | |
218 return retval; | |
219 } | |
220 else | |
221 { | |
222 int ival = NINT (d); | |
223 | |
224 if (ival < 0 || ival > UCHAR_MAX) | |
225 { | |
5775 | 226 // FIXME -- is there something |
5282 | 227 // better we could do? |
228 | |
229 ival = 0; | |
230 | |
231 if (! warned) | |
232 { | |
233 ::warning ("range error for conversion to character value"); | |
234 warned = true; | |
235 } | |
236 } | |
237 | |
238 chm (matrix.ridx(i) + j * nr) = | |
239 static_cast<char> (ival); | |
240 } | |
241 } | |
5322 | 242 retval = octave_value (chm, true, type); |
5282 | 243 } |
244 | |
245 return retval; | |
246 } | |
247 | |
5164 | 248 bool |
249 octave_sparse_matrix::save_binary (std::ostream& os, bool&save_as_floats) | |
250 { | |
251 dim_vector d = this->dims (); | |
252 if (d.length() < 1) | |
253 return false; | |
254 | |
255 // Ensure that additional memory is deallocated | |
256 matrix.maybe_compress (); | |
257 | |
258 int nr = d(0); | |
259 int nc = d(1); | |
5604 | 260 int nz = nzmax (); |
5164 | 261 |
5828 | 262 int32_t itmp; |
5164 | 263 // Use negative value for ndims to be consistent with other formats |
264 itmp= -2; | |
5760 | 265 os.write (reinterpret_cast<char *> (&itmp), 4); |
5164 | 266 |
267 itmp= nr; | |
5760 | 268 os.write (reinterpret_cast<char *> (&itmp), 4); |
5164 | 269 |
270 itmp= nc; | |
5760 | 271 os.write (reinterpret_cast<char *> (&itmp), 4); |
5164 | 272 |
273 itmp= nz; | |
5760 | 274 os.write (reinterpret_cast<char *> (&itmp), 4); |
5164 | 275 |
276 save_type st = LS_DOUBLE; | |
277 if (save_as_floats) | |
278 { | |
279 if (matrix.too_large_for_float ()) | |
280 { | |
281 warning ("save: some values too large to save as floats --"); | |
282 warning ("save: saving as doubles instead"); | |
283 } | |
284 else | |
285 st = LS_FLOAT; | |
286 } | |
5775 | 287 else if (matrix.nzmax () > 8192) // FIXME -- make this configurable. |
5164 | 288 { |
289 double max_val, min_val; | |
290 if (matrix.all_integers (max_val, min_val)) | |
291 st = get_save_type (max_val, min_val); | |
292 } | |
293 | |
294 // add one to the printed indices to go from | |
295 // zero-based to one-based arrays | |
296 for (int i = 0; i < nc+1; i++) | |
297 { | |
298 OCTAVE_QUIT; | |
299 itmp = matrix.cidx(i); | |
5760 | 300 os.write (reinterpret_cast<char *> (&itmp), 4); |
5164 | 301 } |
302 | |
303 for (int i = 0; i < nz; i++) | |
304 { | |
305 OCTAVE_QUIT; | |
306 itmp = matrix.ridx(i); | |
5760 | 307 os.write (reinterpret_cast<char *> (&itmp), 4); |
5164 | 308 } |
309 | |
310 write_doubles (os, matrix.data(), st, nz); | |
311 | |
312 return true; | |
313 } | |
314 | |
315 bool | |
316 octave_sparse_matrix::load_binary (std::istream& is, bool swap, | |
317 oct_mach_info::float_format fmt) | |
318 { | |
5828 | 319 int32_t nz, nc, nr, tmp; |
5327 | 320 char ctmp; |
321 | |
5760 | 322 if (! is.read (reinterpret_cast<char *> (&tmp), 4)) |
5164 | 323 return false; |
324 | |
325 if (swap) | |
326 swap_bytes<4> (&tmp); | |
327 | |
328 if (tmp != -2) { | |
329 error("load: only 2D sparse matrices are supported"); | |
330 return false; | |
331 } | |
332 | |
5760 | 333 if (! is.read (reinterpret_cast<char *> (&nr), 4)) |
5164 | 334 return false; |
5760 | 335 if (! is.read (reinterpret_cast<char *> (&nc), 4)) |
5164 | 336 return false; |
5760 | 337 if (! is.read (reinterpret_cast<char *> (&nz), 4)) |
5164 | 338 return false; |
339 | |
340 if (swap) | |
341 { | |
342 swap_bytes<4> (&nr); | |
343 swap_bytes<4> (&nc); | |
344 swap_bytes<4> (&nz); | |
345 } | |
346 | |
5275 | 347 SparseMatrix m (static_cast<octave_idx_type> (nr), |
348 static_cast<octave_idx_type> (nc), | |
349 static_cast<octave_idx_type> (nz)); | |
5164 | 350 |
351 for (int i = 0; i < nc+1; i++) | |
352 { | |
353 OCTAVE_QUIT; | |
5760 | 354 if (! is.read (reinterpret_cast<char *> (&tmp), 4)) |
5164 | 355 return false; |
356 if (swap) | |
357 swap_bytes<4> (&tmp); | |
358 m.xcidx(i) = tmp; | |
359 } | |
360 | |
361 for (int i = 0; i < nz; i++) | |
362 { | |
363 OCTAVE_QUIT; | |
5760 | 364 if (! is.read (reinterpret_cast<char *> (&tmp), 4)) |
5164 | 365 return false; |
366 if (swap) | |
367 swap_bytes<4> (&tmp); | |
368 m.xridx(i) = tmp; | |
369 } | |
370 | |
5760 | 371 if (! is.read (reinterpret_cast<char *> (&ctmp), 1)) |
5164 | 372 return false; |
373 | |
5760 | 374 read_doubles (is, m.xdata (), static_cast<save_type> (ctmp), nz, swap, fmt); |
5164 | 375 |
376 if (error_state || ! is) | |
377 return false; | |
378 matrix = m; | |
379 | |
380 return true; | |
381 } | |
382 | |
383 #if defined (HAVE_HDF5) | |
5900 | 384 |
5164 | 385 bool |
386 octave_sparse_matrix::save_hdf5 (hid_t loc_id, const char *name, | |
387 bool save_as_floats) | |
388 { | |
389 dim_vector dv = dims (); | |
390 int empty = save_hdf5_empty (loc_id, name, dv); | |
391 if (empty) | |
392 return (empty > 0); | |
393 | |
394 // Ensure that additional memory is deallocated | |
395 matrix.maybe_compress (); | |
396 | |
397 hid_t group_hid = H5Gcreate (loc_id, name, 0); | |
398 if (group_hid < 0) | |
399 return false; | |
400 | |
401 hid_t space_hid = -1, data_hid = -1; | |
402 bool retval = true; | |
403 SparseMatrix m = sparse_matrix_value (); | |
5351 | 404 octave_idx_type tmp; |
5164 | 405 hsize_t hdims[2]; |
406 | |
5760 | 407 space_hid = H5Screate_simple (0, hdims, 0); |
5164 | 408 if (space_hid < 0) |
409 { | |
410 H5Gclose (group_hid); | |
411 return false; | |
412 } | |
413 | |
5351 | 414 data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_IDX, space_hid, |
5164 | 415 H5P_DEFAULT); |
416 if (data_hid < 0) | |
417 { | |
418 H5Sclose (space_hid); | |
419 H5Gclose (group_hid); | |
420 return false; | |
421 } | |
422 | |
423 tmp = m.rows (); | |
5351 | 424 retval = H5Dwrite (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, H5P_DEFAULT, |
5760 | 425 &tmp) >= 0; |
5164 | 426 H5Dclose (data_hid); |
427 if (!retval) | |
428 { | |
429 H5Sclose (space_hid); | |
430 H5Gclose (group_hid); | |
431 return false; | |
432 } | |
433 | |
5351 | 434 data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_IDX, space_hid, |
5164 | 435 H5P_DEFAULT); |
436 if (data_hid < 0) | |
437 { | |
438 H5Sclose (space_hid); | |
439 H5Gclose (group_hid); | |
440 return false; | |
441 } | |
442 | |
443 tmp = m.cols (); | |
5351 | 444 retval = H5Dwrite (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, H5P_DEFAULT, |
5760 | 445 &tmp) >= 0; |
5164 | 446 H5Dclose (data_hid); |
447 if (!retval) | |
448 { | |
449 H5Sclose (space_hid); | |
450 H5Gclose (group_hid); | |
451 return false; | |
452 } | |
453 | |
5351 | 454 data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_IDX, space_hid, |
5164 | 455 H5P_DEFAULT); |
456 if (data_hid < 0) | |
457 { | |
458 H5Sclose (space_hid); | |
459 H5Gclose (group_hid); | |
460 return false; | |
461 } | |
462 | |
5604 | 463 tmp = m.nzmax (); |
5351 | 464 retval = H5Dwrite (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, H5P_DEFAULT, |
5760 | 465 &tmp) >= 0; |
5164 | 466 H5Dclose (data_hid); |
467 if (!retval) | |
468 { | |
469 H5Sclose (space_hid); | |
470 H5Gclose (group_hid); | |
471 return false; | |
472 } | |
473 | |
474 H5Sclose (space_hid); | |
475 | |
476 hdims[0] = m.cols() + 1; | |
477 hdims[1] = 1; | |
478 | |
479 space_hid = H5Screate_simple (2, hdims, 0); | |
480 | |
481 if (space_hid < 0) | |
482 { | |
483 H5Gclose (group_hid); | |
484 return false; | |
485 } | |
486 | |
5351 | 487 data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_IDX, space_hid, |
5164 | 488 H5P_DEFAULT); |
489 if (data_hid < 0) | |
490 { | |
491 H5Sclose (space_hid); | |
492 H5Gclose (group_hid); | |
493 return false; | |
494 } | |
495 | |
5351 | 496 octave_idx_type * itmp = m.xcidx (); |
497 retval = H5Dwrite (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, H5P_DEFAULT, | |
5760 | 498 itmp) >= 0; |
5164 | 499 H5Dclose (data_hid); |
500 if (!retval) | |
501 { | |
502 H5Sclose (space_hid); | |
503 H5Gclose (group_hid); | |
504 return false; | |
505 } | |
506 | |
507 H5Sclose (space_hid); | |
508 | |
5604 | 509 hdims[0] = m.nzmax (); |
5164 | 510 hdims[1] = 1; |
511 | |
512 space_hid = H5Screate_simple (2, hdims, 0); | |
513 | |
514 if (space_hid < 0) | |
515 { | |
516 H5Gclose (group_hid); | |
517 return false; | |
518 } | |
519 | |
5351 | 520 data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_IDX, space_hid, |
5164 | 521 H5P_DEFAULT); |
522 if (data_hid < 0) | |
523 { | |
524 H5Sclose (space_hid); | |
525 H5Gclose (group_hid); | |
526 return false; | |
527 } | |
528 | |
529 itmp = m.xridx (); | |
5351 | 530 retval = H5Dwrite (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, H5P_DEFAULT, |
5760 | 531 itmp) >= 0; |
5164 | 532 H5Dclose (data_hid); |
533 if (!retval) | |
534 { | |
535 H5Sclose (space_hid); | |
536 H5Gclose (group_hid); | |
537 return false; | |
538 } | |
539 | |
540 hid_t save_type_hid = H5T_NATIVE_DOUBLE; | |
541 | |
542 if (save_as_floats) | |
543 { | |
544 if (m.too_large_for_float ()) | |
545 { | |
546 warning ("save: some values too large to save as floats --"); | |
547 warning ("save: saving as doubles instead"); | |
548 } | |
549 else | |
550 save_type_hid = H5T_NATIVE_FLOAT; | |
551 } | |
552 #if HAVE_HDF5_INT2FLOAT_CONVERSIONS | |
553 // hdf5 currently doesn't support float/integer conversions | |
554 else | |
555 { | |
556 double max_val, min_val; | |
557 | |
558 if (m.all_integers (max_val, min_val)) | |
559 save_type_hid | |
560 = save_type_to_hdf5 (get_save_type (max_val, min_val)); | |
561 } | |
562 #endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */ | |
563 | |
564 data_hid = H5Dcreate (group_hid, "data", save_type_hid, space_hid, | |
565 H5P_DEFAULT); | |
566 if (data_hid < 0) | |
567 { | |
568 H5Sclose (space_hid); | |
569 H5Gclose (group_hid); | |
570 return false; | |
571 } | |
572 | |
573 double * dtmp = m.xdata (); | |
574 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, | |
5760 | 575 H5P_DEFAULT, dtmp) >= 0; |
5164 | 576 H5Dclose (data_hid); |
577 H5Sclose (space_hid); | |
578 H5Gclose (group_hid); | |
579 | |
580 return retval; | |
581 } | |
582 | |
583 bool | |
584 octave_sparse_matrix::load_hdf5 (hid_t loc_id, const char *name, | |
5760 | 585 bool /* have_h5giterate_bug */) |
5164 | 586 { |
5351 | 587 octave_idx_type nr, nc, nz; |
5164 | 588 hid_t group_hid, data_hid, space_hid; |
589 hsize_t rank; | |
590 | |
591 dim_vector dv; | |
592 int empty = load_hdf5_empty (loc_id, name, dv); | |
593 if (empty > 0) | |
594 matrix.resize(dv); | |
595 if (empty) | |
596 return (empty > 0); | |
597 | |
598 group_hid = H5Gopen (loc_id, name); | |
5760 | 599 if (group_hid < 0) return false; |
5164 | 600 |
601 data_hid = H5Dopen (group_hid, "nr"); | |
602 space_hid = H5Dget_space (data_hid); | |
603 rank = H5Sget_simple_extent_ndims (space_hid); | |
604 | |
605 if (rank != 0) | |
606 { | |
607 H5Dclose (data_hid); | |
608 H5Gclose (group_hid); | |
609 return false; | |
610 } | |
611 | |
5351 | 612 if (H5Dread (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, |
5760 | 613 H5P_DEFAULT, &nr) < 0) |
5164 | 614 { |
615 H5Dclose (data_hid); | |
616 H5Gclose (group_hid); | |
617 return false; | |
618 } | |
619 | |
620 H5Dclose (data_hid); | |
621 | |
622 data_hid = H5Dopen (group_hid, "nc"); | |
623 space_hid = H5Dget_space (data_hid); | |
624 rank = H5Sget_simple_extent_ndims (space_hid); | |
625 | |
626 if (rank != 0) | |
627 { | |
628 H5Dclose (data_hid); | |
629 H5Gclose (group_hid); | |
630 return false; | |
631 } | |
632 | |
5351 | 633 if (H5Dread (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, |
5760 | 634 H5P_DEFAULT, &nc) < 0) |
5164 | 635 { |
636 H5Dclose (data_hid); | |
637 H5Gclose (group_hid); | |
638 return false; | |
639 } | |
640 | |
641 H5Dclose (data_hid); | |
642 | |
643 data_hid = H5Dopen (group_hid, "nz"); | |
644 space_hid = H5Dget_space (data_hid); | |
645 rank = H5Sget_simple_extent_ndims (space_hid); | |
646 | |
647 if (rank != 0) | |
648 { | |
649 H5Dclose (data_hid); | |
650 H5Gclose (group_hid); | |
651 return false; | |
652 } | |
653 | |
5351 | 654 if (H5Dread (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, |
5760 | 655 H5P_DEFAULT, &nz) < 0) |
5164 | 656 { |
657 H5Dclose (data_hid); | |
658 H5Gclose (group_hid); | |
659 return false; | |
660 } | |
661 | |
662 H5Dclose (data_hid); | |
663 | |
5275 | 664 SparseMatrix m (static_cast<octave_idx_type> (nr), |
665 static_cast<octave_idx_type> (nc), | |
666 static_cast<octave_idx_type> (nz)); | |
5164 | 667 |
668 data_hid = H5Dopen (group_hid, "cidx"); | |
669 space_hid = H5Dget_space (data_hid); | |
670 rank = H5Sget_simple_extent_ndims (space_hid); | |
671 | |
672 if (rank != 2) | |
673 { | |
674 H5Sclose (space_hid); | |
675 H5Dclose (data_hid); | |
676 H5Gclose (group_hid); | |
677 return false; | |
678 } | |
679 | |
680 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); | |
681 OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); | |
682 | |
683 H5Sget_simple_extent_dims (space_hid, hdims, maxdims); | |
684 | |
5322 | 685 if (static_cast<int> (hdims[0]) != nc + 1 || |
686 static_cast<int> (hdims[1]) != 1) | |
5164 | 687 { |
688 H5Sclose (space_hid); | |
689 H5Dclose (data_hid); | |
690 H5Gclose (group_hid); | |
691 return false; | |
692 } | |
693 | |
5351 | 694 octave_idx_type *itmp = m.xcidx (); |
695 if (H5Dread (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, | |
5760 | 696 H5P_DEFAULT, itmp) < 0) |
5164 | 697 { |
698 H5Sclose (space_hid); | |
699 H5Dclose (data_hid); | |
700 H5Gclose (group_hid); | |
701 return false; | |
702 } | |
703 | |
704 H5Sclose (space_hid); | |
705 H5Dclose (data_hid); | |
706 | |
707 data_hid = H5Dopen (group_hid, "ridx"); | |
708 space_hid = H5Dget_space (data_hid); | |
709 rank = H5Sget_simple_extent_ndims (space_hid); | |
710 | |
711 if (rank != 2) | |
712 { | |
713 H5Sclose (space_hid); | |
714 H5Dclose (data_hid); | |
715 H5Gclose (group_hid); | |
716 return false; | |
717 } | |
718 | |
719 H5Sget_simple_extent_dims (space_hid, hdims, maxdims); | |
720 | |
5322 | 721 if (static_cast<int> (hdims[0]) != nz || static_cast<int> (hdims[1]) != 1) |
5164 | 722 { |
723 H5Sclose (space_hid); | |
724 H5Dclose (data_hid); | |
725 H5Gclose (group_hid); | |
726 return false; | |
727 } | |
728 | |
729 itmp = m.xridx (); | |
5351 | 730 if (H5Dread (data_hid, H5T_NATIVE_IDX, H5S_ALL, H5S_ALL, |
5760 | 731 H5P_DEFAULT, itmp) < 0) |
5164 | 732 { |
733 H5Sclose (space_hid); | |
734 H5Dclose (data_hid); | |
735 H5Gclose (group_hid); | |
736 return false; | |
737 } | |
738 | |
739 H5Sclose (space_hid); | |
740 H5Dclose (data_hid); | |
741 | |
742 data_hid = H5Dopen (group_hid, "data"); | |
743 space_hid = H5Dget_space (data_hid); | |
744 rank = H5Sget_simple_extent_ndims (space_hid); | |
745 | |
746 if (rank != 2) | |
747 { | |
748 H5Sclose (space_hid); | |
749 H5Dclose (data_hid); | |
750 H5Gclose (group_hid); | |
751 return false; | |
752 } | |
753 | |
754 H5Sget_simple_extent_dims (space_hid, hdims, maxdims); | |
755 | |
5322 | 756 if (static_cast<int> (hdims[0]) != nz || static_cast<int> (hdims[1]) != 1) |
5164 | 757 { |
758 H5Sclose (space_hid); | |
759 H5Dclose (data_hid); | |
760 H5Gclose (group_hid); | |
761 return false; | |
762 } | |
763 | |
764 double *dtmp = m.xdata (); | |
765 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, | |
5760 | 766 H5P_DEFAULT, dtmp) < 0) |
5164 | 767 { |
768 H5Sclose (space_hid); | |
769 H5Dclose (data_hid); | |
770 H5Gclose (group_hid); | |
771 return false; | |
772 } | |
773 | |
774 H5Sclose (space_hid); | |
775 H5Dclose (data_hid); | |
776 H5Gclose (group_hid); | |
777 | |
778 matrix = m; | |
779 | |
780 return true; | |
781 } | |
5900 | 782 |
5164 | 783 #endif |
784 | |
5900 | 785 mxArray * |
786 octave_sparse_matrix::as_mxArray (void) const | |
787 { | |
6686 | 788 mwSize nz = nzmax(); |
789 mwSize nr = rows(); | |
790 mwSize nc = columns(); | |
5903 | 791 mxArray *retval = new mxArray (mxDOUBLE_CLASS, nr, nc, nz, mxREAL); |
792 double *pr = static_cast<double *> (retval->get_data ()); | |
6686 | 793 mwIndex *ir = retval->get_ir(); |
794 mwIndex *jc = retval->get_jc(); | |
5903 | 795 |
6686 | 796 for (mwIndex i = 0; i < nz; i++) |
5903 | 797 { |
798 pr[i] = matrix.data(i); | |
799 ir[i] = matrix.ridx(i); | |
800 } | |
801 | |
6686 | 802 for (mwIndex i = 0; i < nc + 1; i++) |
5903 | 803 jc[i] = matrix.cidx(i); |
804 | |
805 return retval; | |
5900 | 806 } |
807 | |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
808 static bool |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
809 any_element_less_than (const SparseMatrix& a, double val) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
810 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
811 octave_idx_type len = a.nnz (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
812 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
813 if (val > 0. && len != a.numel ()) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
814 return true; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
815 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
816 for (octave_idx_type i = 0; i < len; i++) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
817 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
818 OCTAVE_QUIT; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
819 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
820 if (a.data(i) < val) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
821 return true; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
822 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
823 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
824 return false; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
825 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
826 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
827 static bool |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
828 any_element_greater_than (const SparseMatrix& a, double val) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
829 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
830 octave_idx_type len = a.nnz (); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
831 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
832 if (val < 0. && len != a.numel ()) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
833 return true; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
834 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
835 for (octave_idx_type i = 0; i < len; i++) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
836 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
837 OCTAVE_QUIT; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
838 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
839 if (a.data(i) > val) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
840 return true; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
841 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
842 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
843 return false; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
844 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
845 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
846 #define SPARSE_MAPPER(MAP, AMAP, FCN) \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
847 octave_value \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
848 octave_sparse_matrix::MAP (void) const \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
849 { \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
850 static AMAP dmap = FCN; \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
851 return matrix.map (dmap); \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
852 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
853 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
854 #define CD_SPARSE_MAPPER(MAP, RFCN, CFCN, L1, L2) \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
855 octave_value \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
856 octave_sparse_matrix::MAP (void) const \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
857 { \ |
7667
fb3a6c53c2b2
Allow negative zero imaginary part to be treated as zero for erf, erfc, gamma and lgamma mapper function
David Bateman <dbateman@free.fr>
parents:
7638
diff
changeset
|
858 static SparseMatrix::dmapper dmap = RFCN; \ |
fb3a6c53c2b2
Allow negative zero imaginary part to be treated as zero for erf, erfc, gamma and lgamma mapper function
David Bateman <dbateman@free.fr>
parents:
7638
diff
changeset
|
859 static SparseMatrix::cmapper cmap = CFCN; \ |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
860 \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
861 return (any_element_less_than (matrix, L1) \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
862 ? octave_value (matrix.map (cmap)) \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
863 : (any_element_greater_than (matrix, L2) \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
864 ? octave_value (matrix.map (cmap)) \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
865 : octave_value (matrix.map (dmap)))); \ |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
866 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
867 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
868 static double |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
869 xconj (double x) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
870 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
871 return x; |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
872 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
873 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
874 SPARSE_MAPPER (erf, SparseMatrix::dmapper, ::erf) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
875 SPARSE_MAPPER (erfc, SparseMatrix::dmapper, ::erfc) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
876 SPARSE_MAPPER (gamma, SparseMatrix::dmapper, xgamma) |
7601
8a939b217863
Treat negative values to lgamma and beta correctly
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
877 CD_SPARSE_MAPPER (lgamma, xlgamma, xlgamma, 0.0, octave_Inf) |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
878 SPARSE_MAPPER (abs, SparseMatrix::dmapper, ::fabs) |
12050
3df527f71cee
use complex function for acos mapper if arg is out of range [-1, 1]
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
879 CD_SPARSE_MAPPER (acos, ::acos, ::acos, -1.0, 1.0) |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
880 CD_SPARSE_MAPPER (acosh, ::acosh, ::acosh, 1.0, octave_Inf) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
881 SPARSE_MAPPER (angle, SparseMatrix::dmapper, ::arg) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
882 SPARSE_MAPPER (arg, SparseMatrix::dmapper, ::arg) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
883 CD_SPARSE_MAPPER (asin, ::asin, ::asin, -1.0, 1.0) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
884 SPARSE_MAPPER (asinh, SparseMatrix::dmapper, ::asinh) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
885 SPARSE_MAPPER (atan, SparseMatrix::dmapper, ::atan) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
886 CD_SPARSE_MAPPER (atanh, ::atanh, ::atanh, -1.0, 1.0) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
887 SPARSE_MAPPER (ceil, SparseMatrix::dmapper, ::ceil) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
888 SPARSE_MAPPER (conj, SparseMatrix::dmapper, xconj) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
889 SPARSE_MAPPER (cos, SparseMatrix::dmapper, ::cos) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
890 SPARSE_MAPPER (cosh, SparseMatrix::dmapper, ::cosh) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
891 SPARSE_MAPPER (exp, SparseMatrix::dmapper, ::exp) |
7638
2df457529cfa
implement expm1 and log1p functions
Jaroslav Hajek <highegg@gmail.com>
parents:
7636
diff
changeset
|
892 SPARSE_MAPPER (expm1, SparseMatrix::dmapper, ::expm1) |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
893 SPARSE_MAPPER (fix, SparseMatrix::dmapper, ::fix) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
894 SPARSE_MAPPER (floor, SparseMatrix::dmapper, ::floor) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
895 SPARSE_MAPPER (imag, SparseMatrix::dmapper, ::imag) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
896 CD_SPARSE_MAPPER (log, ::log, std::log, 0.0, octave_Inf) |
7740 | 897 CD_SPARSE_MAPPER (log2, xlog2, xlog2, 0.0, octave_Inf) |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
898 CD_SPARSE_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) |
7638
2df457529cfa
implement expm1 and log1p functions
Jaroslav Hajek <highegg@gmail.com>
parents:
7636
diff
changeset
|
899 CD_SPARSE_MAPPER (log1p, ::log1p, ::log1p, 0.0, octave_Inf) |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
900 SPARSE_MAPPER (real, SparseMatrix::dmapper, ::real) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
901 SPARSE_MAPPER (round, SparseMatrix::dmapper, xround) |
7636
99c410f7f0b0
implement mapper function for banker's rounding
Jaroslav Hajek <highegg@gmail.com>
parents:
7601
diff
changeset
|
902 SPARSE_MAPPER (roundb, SparseMatrix::dmapper, xroundb) |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
903 SPARSE_MAPPER (signum, SparseMatrix::dmapper, ::signum) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
904 SPARSE_MAPPER (sin, SparseMatrix::dmapper, ::sin) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
905 SPARSE_MAPPER (sinh, SparseMatrix::dmapper, ::sinh) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
906 CD_SPARSE_MAPPER (sqrt, ::sqrt, std::sqrt, 0.0, octave_Inf) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
907 SPARSE_MAPPER (tan, SparseMatrix::dmapper, ::tan) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
908 SPARSE_MAPPER (tanh, SparseMatrix::dmapper, ::tanh) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
909 SPARSE_MAPPER (finite, SparseMatrix::bmapper, xfinite) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
910 SPARSE_MAPPER (isinf, SparseMatrix::bmapper, xisinf) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
911 SPARSE_MAPPER (isna, SparseMatrix::bmapper, octave_is_NA) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
912 SPARSE_MAPPER (isnan, SparseMatrix::bmapper, xisnan) |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7193
diff
changeset
|
913 |
5164 | 914 /* |
915 ;;; Local Variables: *** | |
916 ;;; mode: C++ *** | |
917 ;;; End: *** | |
918 */ |