GNU Octave 7.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
Sparse.h
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1998-2022 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if ! defined (octave_Sparse_h)
27#define octave_Sparse_h 1
28
29#include "octave-config.h"
30
31#include <cassert>
32#include <cstddef>
33
34#include <algorithm>
35#include <iosfwd>
36#include <string>
37
38#include "Array-fwd.h"
39#include "Sparse-fwd.h"
40#include "mx-fwd.h"
41
42// Two dimensional sparse class. Handles the reference counting for
43// all the derived classes.
44
45template <typename T, typename Alloc>
46class
49{
50public:
51
52 typedef T element_type;
53
54protected:
55 //--------------------------------------------------------------------
56 // The real representation of all Sparse arrays.
57 //--------------------------------------------------------------------
58
59class SparseRep : public Alloc
60 {
61 public:
62
63 typedef std::allocator_traits<Alloc> Alloc_traits;
64
65 typedef typename Alloc_traits::template rebind_traits<T> T_Alloc_traits;
66 typedef typename T_Alloc_traits::pointer T_pointer;
67
68 typedef typename Alloc_traits::template rebind_traits<octave_idx_type> idx_type_Alloc_traits;
69 typedef typename idx_type_Alloc_traits::pointer idx_type_pointer;
70
78
79 SparseRep (void)
80 : Alloc (), m_data (T_allocate (1)), m_ridx (idx_type_allocate (1)),
81 m_cidx (idx_type_allocate (1)),
82 m_nzmax (1), m_nrows (0), m_ncols (0), m_count (1)
83 { }
84
86 : Alloc (), m_data (T_allocate (1)), m_ridx (idx_type_allocate (1)),
87 m_cidx (idx_type_allocate (n+1)),
88 m_nzmax (1), m_nrows (n), m_ncols (n), m_count (1)
89 { }
90
92 : Alloc (), m_data (T_allocate (nz > 0 ? nz : 1)),
93 m_ridx (idx_type_allocate (nz > 0 ? nz : 1)),
94 m_cidx (idx_type_allocate (nc+1)),
95 m_nzmax (nz > 0 ? nz : 1), m_nrows (nr), m_ncols (nc), m_count (1)
96 { }
97
99 const T *d, const octave_idx_type *r, const octave_idx_type *c)
100 : Alloc (), m_data (T_allocate (nz)),
101 m_ridx (idx_type_allocate (nz)),
102 m_cidx (idx_type_allocate (nc+1)),
103 m_nzmax (nz), m_nrows (nr), m_ncols (nc), m_count (1)
104 {
105 std::copy_n (d, nz, m_data);
106 std::copy_n (r, nz, m_ridx);
107 std::copy_n (c, m_ncols + 1, m_cidx);
108 }
109
110 template <typename U>
112 const U *d, const octave_idx_type *r, const octave_idx_type *c)
113 : Alloc (), m_data (T_allocate (nz)),
114 m_ridx (idx_type_allocate (nz)),
115 m_cidx (idx_type_allocate (nc+1)),
116 m_nzmax (nz), m_nrows (nr), m_ncols (nc), m_count (1)
117 {
118 std::copy_n (d, nz, m_data);
119 std::copy_n (r, nz, m_ridx);
120 std::copy_n (c, nc + 1, m_cidx);
121 }
122
123 template <typename U>
126 const Alloc& xallocator = Alloc ())
127 : Alloc (xallocator), m_data (d), m_ridx (r), m_cidx (c),
128 m_nzmax (nz), m_nrows (dv(0)), m_ncols (dv(1)), m_count (1)
129 { }
130
132 : Alloc (), m_data (T_allocate (a.m_nzmax)),
133 m_ridx (idx_type_allocate (a.m_nzmax)),
134 m_cidx (idx_type_allocate (a.m_ncols + 1)),
135 m_nzmax (a.m_nzmax), m_nrows (a.m_nrows), m_ncols (a.m_ncols),
136 m_count (1)
137 {
138 octave_idx_type nz = a.nnz ();
139 std::copy_n (a.m_data, nz, m_data);
140 std::copy_n (a.m_ridx, nz, m_ridx);
141 std::copy_n (a.m_cidx, m_ncols + 1, m_cidx);
142 }
143
145 {
146 T_deallocate (m_data, m_nzmax);
147 idx_type_deallocate (m_ridx, m_nzmax);
148 idx_type_deallocate (m_cidx, m_ncols + 1);
149 }
150
151 octave_idx_type nzmax (void) const { return m_nzmax; }
152 octave_idx_type nnz (void) const { return m_cidx[m_ncols]; }
153
154 octave_idx_type rows (void) const { return m_nrows; }
155 octave_idx_type cols (void) const { return m_ncols; }
156 octave_idx_type columns (void) const { return m_ncols; }
157
159
160 OCTAVE_API T celem (octave_idx_type r, octave_idx_type c) const;
161
162 T& data (octave_idx_type i) { return m_data[i]; }
163
164 T cdata (octave_idx_type i) const { return m_data[i]; }
165
166 octave_idx_type& ridx (octave_idx_type i) { return m_ridx[i]; }
167
168 octave_idx_type cridx (octave_idx_type i) const { return m_ridx[i]; }
169
170 octave_idx_type& cidx (octave_idx_type i) { return m_cidx[i]; }
171
172 octave_idx_type ccidx (octave_idx_type i) const { return m_cidx[i]; }
173
174 OCTAVE_API void maybe_compress (bool remove_zeros);
175
176 OCTAVE_API void change_length (octave_idx_type nz);
177
178 OCTAVE_API bool indices_ok (void) const;
179
180 OCTAVE_API bool any_element_is_nan (void) const;
181
182 // Prefer nzmax.
183 octave_idx_type length (void) const { return m_nzmax; }
184
185 template <typename U, typename A> friend class Sparse;
186
187 // No assignment!
188
189 SparseRep& operator = (const SparseRep&) = delete;
190
192 {
193 typename T_Alloc_traits::allocator_type& alloc = *this;
194
195 T_pointer data = T_Alloc_traits::allocate (alloc, len);
196 for (size_t i = 0; i < len; i++)
197 T_Alloc_traits::construct (alloc, data+i);
198
199 return data;
200 }
201
203 {
204 typename T_Alloc_traits::allocator_type& alloc = *this;
205
206 for (size_t i = 0; i < len; i++)
207 T_Alloc_traits::destroy (alloc, data+i);
208 T_Alloc_traits::deallocate (alloc, data, len);
209 }
210
212 {
213 typename idx_type_Alloc_traits::allocator_type alloc = *this;
214
215 idx_type_pointer idx = idx_type_Alloc_traits::allocate (alloc, len);
216 for (size_t i = 0; i < len; i++)
217 idx_type_Alloc_traits::construct (alloc, idx+i);
218
219 return idx;
220 }
221
223 {
224 typename idx_type_Alloc_traits::allocator_type alloc = *this;
225
226 for (size_t i = 0; i < len; i++)
227 idx_type_Alloc_traits::destroy (alloc, idx+i);
228 idx_type_Alloc_traits::deallocate (alloc, idx, len);
229 }
230 };
231
232 //--------------------------------------------------------------------
233
234 void make_unique (void)
235 {
236 if (m_rep->m_count > 1)
237 {
238 SparseRep *r = new SparseRep (*m_rep);
239
240 if (--m_rep->m_count == 0)
241 delete m_rep;
242
243 m_rep = r;
244 }
245 }
246
247protected:
248
250
252
253private:
254
255 static OCTAVE_API typename Sparse<T, Alloc>::SparseRep * nil_rep (void);
256
257public:
258
259 Sparse (void)
260 : m_rep (nil_rep ()), m_dimensions (dim_vector (0, 0))
261 {
262 m_rep->m_count++;
263 }
264
266 : m_rep (new typename Sparse<T, Alloc>::SparseRep (n)),
267 m_dimensions (dim_vector (n, n)) { }
268
270 : m_rep (new typename Sparse<T, Alloc>::SparseRep (nr, nc)),
271 m_dimensions (dim_vector (nr, nc)) { }
272
273 explicit OCTAVE_API Sparse (octave_idx_type nr, octave_idx_type nc, T val);
274
276 : m_rep (new typename Sparse<T, Alloc>::SparseRep (dv(0), dv(1), nz)),
277 m_dimensions (dv) { }
278
280 : m_rep (new typename Sparse<T, Alloc>::SparseRep (nr, nc, nz)),
281 m_dimensions (dim_vector (nr, nc)) { }
282
283 // Construct a Sparse array from pointers to externally allocated
284 // arrays of values and indices. PTR, RIDX, and CIDX must be
285 // allocated with operator new. The Sparse object takes ownership of
286 // these arrays and will delete them when the Sparse object is
287 // deleted. The dimension vector DV must be consistent with the sizes
288 // of the allocated PTR, CIDX, and RIDX arrays.
289
292 const Alloc& xallocator = Alloc ())
293 : m_rep (new typename Sparse<T, Alloc>::SparseRep (dv, nz, ptr, ridx, cidx, xallocator)),
294 m_dimensions (dv)
295 { }
296
297 // Both SparseMatrix and SparseBoolMatrix need this ctor, and this
298 // is their only common ancestor.
299 explicit OCTAVE_API Sparse (const PermMatrix& a);
300
301 // Type conversion case. Preserves nzmax.
302 template <typename U>
303 Sparse (const Sparse<U>& a)
304 : m_rep (new typename Sparse<T, Alloc>::SparseRep (a.rows (), a.cols (),
305 a.nzmax (), a.data (),
306 a.ridx (), a.cidx ())),
307 m_dimensions (a.dims ()) { }
308
309 // No type conversion case.
312 {
313 m_rep->m_count++;
314 }
315
316public:
317
318 OCTAVE_API Sparse (const dim_vector& dv);
319
320 OCTAVE_API Sparse (const Sparse<T, Alloc>& a, const dim_vector& dv);
321
323 Sparse (const Array<T>& a, const octave::idx_vector& r, const octave::idx_vector& c,
324 octave_idx_type nr = -1, octave_idx_type nc = -1,
325 bool sum_terms = true, octave_idx_type nzm = -1);
326
327 // Sparsify a normal matrix
328 OCTAVE_API Sparse (const Array<T>& a);
329
330 virtual ~Sparse (void);
331
333
334 //! Amount of storage for nonzero elements.
335 //! This may differ from the actual number of elements, see nnz().
336 octave_idx_type nzmax (void) const { return m_rep->nzmax (); }
337
338 //! Actual number of nonzero terms.
339 octave_idx_type nnz (void) const { return m_rep->nnz (); }
340
341 // Querying the number of elements (incl. zeros) may overflow the index type,
342 // so don't do it unless you really need it.
344 {
345 return m_dimensions.safe_numel ();
346 }
347
348 octave_idx_type dim1 (void) const { return m_dimensions(0); }
349 octave_idx_type dim2 (void) const { return m_dimensions(1); }
350
351 octave_idx_type rows (void) const { return dim1 (); }
352 octave_idx_type cols (void) const { return dim2 (); }
353 octave_idx_type columns (void) const { return dim2 (); }
354
357 {
358 octave_idx_type ret = 0;
359 while (cidx (ret+1) < k)
360 ret++;
361 return ret;
362 }
363
364 std::size_t byte_size (void) const
365 {
366 return (static_cast<std::size_t> (cols () + 1) * sizeof (octave_idx_type)
367 + static_cast<std::size_t> (nzmax ())
368 * (sizeof (T) + sizeof (octave_idx_type)));
369 }
370
371 dim_vector dims (void) const { return m_dimensions; }
372
373 Sparse<T, Alloc> squeeze (void) const { return *this; }
374
377
378 OCTAVE_NORETURN OCTAVE_API T
379 range_error (const char *fcn, octave_idx_type n) const;
380 OCTAVE_NORETURN OCTAVE_API T&
381 range_error (const char *fcn, octave_idx_type n);
382
383 OCTAVE_NORETURN OCTAVE_API T
384 range_error (const char *fcn, octave_idx_type i, octave_idx_type j) const;
385 OCTAVE_NORETURN OCTAVE_API T&
386 range_error (const char *fcn, octave_idx_type i, octave_idx_type j);
387
388 OCTAVE_NORETURN OCTAVE_API T
389 range_error (const char *fcn, const Array<octave_idx_type>& ra_idx) const;
390 OCTAVE_NORETURN OCTAVE_API T&
391 range_error (const char *fcn, const Array<octave_idx_type>& ra_idx);
392
393 // No checking, even for multiple references, ever.
394
396 {
397 octave_idx_type i = n % rows ();
398 octave_idx_type j = n / rows ();
399 return xelem (i, j);
400 }
401
403 {
404 octave_idx_type i = n % rows ();
405 octave_idx_type j = n / rows ();
406 return xelem (i, j);
407 }
408
409 T& xelem (octave_idx_type i, octave_idx_type j) { return m_rep->elem (i, j); }
411 {
412 return m_rep->celem (i, j);
413 }
414
416 { return xelem (compute_index (ra_idx)); }
417
419 { return xelem (compute_index (ra_idx)); }
420
421 // FIXME: would be nice to fix this so that we don't unnecessarily force a
422 // copy, but that is not so easy, and I see no clean way to do it.
423
425 {
426 if (n < 0 || n >= numel ())
427 range_error ("T& Sparse<T>::checkelem", n);
428 else
429 {
430 make_unique ();
431 return xelem (n);
432 }
433 }
434
436 {
437 if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ())
438 range_error ("T& Sparse<T>::checkelem", i, j);
439 else
440 {
441 make_unique ();
442 return xelem (i, j);
443 }
444 }
445
447 {
449
450 if (i < 0)
451 range_error ("T& Sparse<T>::checkelem", ra_idx);
452 else
453 return elem (i);
454 }
455
457 {
458 make_unique ();
459 return xelem (n);
460 }
461
463 {
464 make_unique ();
465 return xelem (i, j);
466 }
467
470
472 {
473 return elem (n);
474 }
475
477 {
478 return elem (i, j);
479 }
480
482 {
483 return elem (ra_idx);
484 }
485
487 {
488 if (n < 0 || n >= numel ())
489 range_error ("T Sparse<T>::checkelem", n);
490 else
491 return xelem (n);
492 }
493
495 {
496 if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ())
497 range_error ("T Sparse<T>::checkelem", i, j);
498 else
499 return xelem (i, j);
500 }
501
503 {
505
506 if (i < 0)
507 range_error ("T Sparse<T>::checkelem", ra_idx);
508 else
509 return Sparse<T, Alloc>::elem (i);
510 }
511
512 T elem (octave_idx_type n) const { return xelem (n); }
513
514 T elem (octave_idx_type i, octave_idx_type j) const { return xelem (i, j); }
515
518
519 T operator () (octave_idx_type n) const { return elem (n); }
520
522 {
523 return elem (i, j);
524 }
525
527 {
528 return elem (ra_idx);
529 }
530
531 Sparse<T, Alloc> maybe_compress (bool remove_zeros = false)
532 {
533 if (remove_zeros)
534 make_unique (); // Need to unshare because elements are removed.
535
536 m_rep->maybe_compress (remove_zeros);
537 return (*this);
538 }
539
540 OCTAVE_API Sparse<T, Alloc> reshape (const dim_vector& new_dims) const;
541
543 permute (const Array<octave_idx_type>& vec, bool inv = false) const;
544
546 {
547 return permute (vec, true);
548 }
549
551
553
554 OCTAVE_API void resize (const dim_vector& dv);
555
557 {
558 if (nz < nnz ())
559 make_unique (); // Unshare now because elements will be truncated.
560 m_rep->change_length (nz);
561 }
562
566 insert (const Sparse<T, Alloc>& a, const Array<octave_idx_type>& idx);
567
568 bool issquare (void) const { return (dim1 () == dim2 ()); }
569
570 bool isempty (void) const { return (rows () < 1 || cols () < 1); }
571
573
574 T * data (void) { make_unique (); return m_rep->m_data; }
575 T& data (octave_idx_type i) { make_unique (); return m_rep->data (i); }
576 T * xdata (void) { return m_rep->m_data; }
577 T& xdata (octave_idx_type i) { return m_rep->data (i); }
578
579 T data (octave_idx_type i) const { return m_rep->data (i); }
580 // FIXME: shouldn't this be returning const T*?
581 T * data (void) const { return m_rep->m_data; }
582
583 octave_idx_type * ridx (void) { make_unique (); return m_rep->m_ridx; }
585 {
586 make_unique (); return m_rep->ridx (i);
587 }
588
589 octave_idx_type * xridx (void) { return m_rep->m_ridx; }
591
592 octave_idx_type ridx (octave_idx_type i) const { return m_rep->cridx (i); }
593 // FIXME: shouldn't this be returning const octave_idx_type*?
594 octave_idx_type * ridx (void) const { return m_rep->m_ridx; }
595
596 octave_idx_type * cidx (void) { make_unique (); return m_rep->m_cidx; }
598 {
599 make_unique (); return m_rep->cidx (i);
600 }
601
602 octave_idx_type * xcidx (void) { return m_rep->m_cidx; }
604
605 octave_idx_type cidx (octave_idx_type i) const { return m_rep->ccidx (i); }
606 // FIXME: shouldn't this be returning const octave_idx_type*?
607 octave_idx_type * cidx (void) const { return m_rep->m_cidx; }
608
609 octave_idx_type ndims (void) const { return m_dimensions.ndims (); }
610
612
613 OCTAVE_API void delete_elements (int dim, const octave::idx_vector& i);
614
616
618 index (const octave::idx_vector& i, bool resize_ok = false) const;
619
621 index (const octave::idx_vector& i, const octave::idx_vector& j,
622 bool resize_ok = false) const;
623
624 OCTAVE_API void assign (const octave::idx_vector& i,
625 const Sparse<T, Alloc>& rhs);
626
627 OCTAVE_API void assign (const octave::idx_vector& i, const T& rhs);
628
629 OCTAVE_API void
630 assign (const octave::idx_vector& i, const octave::idx_vector& j,
631 const Sparse<T, Alloc>& rhs);
632
633 OCTAVE_API void
634 assign (const octave::idx_vector& i, const octave::idx_vector& j,
635 const T& rhs);
636
637 OCTAVE_API void
638 print_info (std::ostream& os, const std::string& prefix) const;
639
641 sort (octave_idx_type dim = 0, sortmode mode = ASCENDING) const;
644 sortmode mode = ASCENDING) const;
645
647
648 // dim = -1 and dim = -2 are special; see Array<T>::cat description.
650 cat (int dim, octave_idx_type n, const Sparse<T, Alloc> *sparse_list);
651
652 OCTAVE_API Array<T> array_value (void) const;
653
654 // Generic any/all test functionality with arbitrary predicate.
655 template <typename F, bool zero>
656 bool test (F fcn) const
657 {
658 return octave::any_all_test<F, T, zero> (fcn, data (), nnz ());
659 }
660
661 // Simpler calls.
662 template <typename F>
663 bool test_any (F fcn) const
664 { return test<F, false> (fcn); }
665
666 template <typename F>
667 bool test_all (F fcn) const
668 { return test<F, true> (fcn); }
669
670 // Overloads for function references.
671 bool test_any (bool (&fcn) (T)) const
672 { return test<bool (&) (T), false> (fcn); }
673
674 bool test_any (bool (&fcn) (const T&)) const
675 { return test<bool (&) (const T&), false> (fcn); }
676
677 bool test_all (bool (&fcn) (T)) const
678 { return test<bool (&) (T), true> (fcn); }
679
680 bool test_all (bool (&fcn) (const T&)) const
681 { return test<bool (&) (const T&), true> (fcn); }
682
683 template <typename U, typename F>
685 map (F fcn) const
686 {
687 Sparse<U> result;
688 U f_zero = fcn (0.0);
689
690 if (f_zero != 0.0)
691 {
692 octave_idx_type nr = rows ();
693 octave_idx_type nc = cols ();
694
695 result = Sparse<U> (nr, nc, f_zero);
696
697 for (octave_idx_type j = 0; j < nc; j++)
698 for (octave_idx_type i = cidx (j); i < cidx (j+1); i++)
699 {
700 octave_quit ();
701 /* Use data instead of elem for better performance. */
702 result.data (ridx (i) + j * nr) = fcn (data (i));
703 }
704
705 result.maybe_compress (true);
706 }
707 else
708 {
709 octave_idx_type nz = nnz ();
710 octave_idx_type nr = rows ();
711 octave_idx_type nc = cols ();
712
713 result = Sparse<U> (nr, nc, nz);
714 octave_idx_type ii = 0;
715 result.cidx (ii) = 0;
716
717 for (octave_idx_type j = 0; j < nc; j++)
718 {
719 for (octave_idx_type i = cidx (j); i < cidx (j+1); i++)
720 {
721 U val = fcn (data (i));
722 if (val != 0.0)
723 {
724 result.data (ii) = val;
725 result.ridx (ii++) = ridx (i);
726 }
727 octave_quit ();
728 }
729 result.cidx (j+1) = ii;
730 }
731
732 result.maybe_compress (false);
733 }
734
735 return result;
736 }
737
738 // Overloads for function references.
739 template <typename U>
741 map (U (&fcn) (T)) const
742 { return map<U, U (&) (T)> (fcn); }
743
744 template <typename U>
746 map (U (&fcn) (const T&)) const
747 { return map<U, U (&) (const T&)> (fcn); }
748
749 bool indices_ok (void) const { return m_rep->indices_ok (); }
750
751 bool any_element_is_nan (void) const
752 { return m_rep->any_element_is_nan (); }
753};
754
755template <typename T>
757std::istream&
758read_sparse_matrix (std::istream& is, Sparse<T>& a,
759 T (*read_fcn) (std::istream&));
760
761#endif
octave_idx_type compute_index(octave_idx_type n, const dim_vector &dims)
Definition: Array-util.cc:177
class OCTARRAY_API Sparse
Definition: Sparse-fwd.h:40
OCTAVE_API std::istream & read_sparse_matrix(std::istream &is, Sparse< T > &a, T(*read_fcn)(std::istream &))
Definition: Sparse.cc:2791
static int elem
Definition: __contourc__.cc:54
OCTAVE_API T celem(octave_idx_type r, octave_idx_type c) const
Definition: Sparse.cc:108
SparseRep & operator=(const SparseRep &)=delete
SparseRep(const dim_vector &dv, octave_idx_type nz, U *d, octave_idx_type *r, octave_idx_type *c, const Alloc &xallocator=Alloc())
Definition: Sparse.h:124
OCTAVE_API void change_length(octave_idx_type nz)
Definition: Sparse.cc:145
octave_idx_type length(void) const
Definition: Sparse.h:183
SparseRep(void)
Definition: Sparse.h:79
octave_idx_type m_ncols
Definition: Sparse.h:76
void T_deallocate(T_pointer data, size_t len)
Definition: Sparse.h:202
octave::refcount< octave_idx_type > m_count
Definition: Sparse.h:77
octave_idx_type nnz(void) const
Definition: Sparse.h:152
idx_type_pointer m_cidx
Definition: Sparse.h:73
Alloc_traits::template rebind_traits< T > T_Alloc_traits
Definition: Sparse.h:65
T_pointer m_data
Definition: Sparse.h:71
OCTAVE_API bool any_element_is_nan(void) const
Definition: Sparse.cc:187
SparseRep(octave_idx_type n)
Definition: Sparse.h:85
OCTAVE_API bool indices_ok(void) const
Definition: Sparse.cc:179
SparseRep(octave_idx_type nr, octave_idx_type nc, octave_idx_type nz, const T *d, const octave_idx_type *r, const octave_idx_type *c)
Definition: Sparse.h:98
T cdata(octave_idx_type i) const
Definition: Sparse.h:164
T_pointer T_allocate(size_t len)
Definition: Sparse.h:191
octave_idx_type m_nrows
Definition: Sparse.h:75
SparseRep(const SparseRep &a)
Definition: Sparse.h:131
octave_idx_type rows(void) const
Definition: Sparse.h:154
T & data(octave_idx_type i)
Definition: Sparse.h:162
octave_idx_type & ridx(octave_idx_type i)
Definition: Sparse.h:166
octave_idx_type columns(void) const
Definition: Sparse.h:156
SparseRep(octave_idx_type nr, octave_idx_type nc, octave_idx_type nz=1)
Definition: Sparse.h:91
OCTAVE_API T & elem(octave_idx_type r, octave_idx_type c)
Definition: Sparse.cc:66
SparseRep(octave_idx_type nr, octave_idx_type nc, octave_idx_type nz, const U *d, const octave_idx_type *r, const octave_idx_type *c)
Definition: Sparse.h:111
idx_type_pointer m_ridx
Definition: Sparse.h:72
T_Alloc_traits::pointer T_pointer
Definition: Sparse.h:66
octave_idx_type m_nzmax
Definition: Sparse.h:74
~SparseRep(void)
Definition: Sparse.h:144
idx_type_pointer idx_type_allocate(size_t len)
Definition: Sparse.h:211
std::allocator_traits< Alloc > Alloc_traits
Definition: Sparse.h:63
octave_idx_type cridx(octave_idx_type i) const
Definition: Sparse.h:168
idx_type_Alloc_traits::pointer idx_type_pointer
Definition: Sparse.h:69
OCTAVE_API void maybe_compress(bool remove_zeros)
Definition: Sparse.cc:120
octave_idx_type & cidx(octave_idx_type i)
Definition: Sparse.h:170
octave_idx_type ccidx(octave_idx_type i) const
Definition: Sparse.h:172
octave_idx_type cols(void) const
Definition: Sparse.h:155
Alloc_traits::template rebind_traits< octave_idx_type > idx_type_Alloc_traits
Definition: Sparse.h:68
void idx_type_deallocate(idx_type_pointer idx, size_t len)
Definition: Sparse.h:222
octave_idx_type nzmax(void) const
Definition: Sparse.h:151
Definition: Sparse.h:49
virtual ~Sparse(void)
Definition: Sparse.cc:708
octave_idx_type rows(void) const
Definition: Sparse.h:351
T * data(void)
Definition: Sparse.h:574
Sparse(void)
Definition: Sparse.h:259
Sparse< T, Alloc > squeeze(void) const
Definition: Sparse.h:373
T & data(octave_idx_type i)
Definition: Sparse.h:575
Sparse< U > map(U(&fcn)(const T &)) const
Definition: Sparse.h:746
T xelem(const Array< octave_idx_type > &ra_idx) const
Definition: Sparse.h:418
octave_idx_type ndims(void) const
Definition: Sparse.h:609
Sparse(octave_idx_type nr, octave_idx_type nc, octave_idx_type nz)
Definition: Sparse.h:279
bool test_all(F fcn) const
Definition: Sparse.h:667
octave_idx_type dim1(void) const
Definition: Sparse.h:348
T checkelem(octave_idx_type n) const
Definition: Sparse.h:486
octave_idx_type columns(void) const
Definition: Sparse.h:353
Sparse(const dim_vector &dv, octave_idx_type nz)
Definition: Sparse.h:275
T elem(const Array< octave_idx_type > &ra_idx) const
Definition: Sparse.h:516
octave_idx_type get_col_index(octave_idx_type k)
Definition: Sparse.h:356
octave_idx_type & ridx(octave_idx_type i)
Definition: Sparse.h:584
OCTAVE_API Sparse< T, Alloc > & insert(const Sparse< T, Alloc > &a, octave_idx_type r, octave_idx_type c)
Definition: Sparse.cc:1042
static OCTAVE_API Sparse< T, Alloc >::SparseRep * nil_rep(void)
Definition: Sparse.cc:57
std::size_t byte_size(void) const
Definition: Sparse.h:364
OCTAVE_API void print_info(std::ostream &os, const std::string &prefix) const
Definition: Sparse.cc:3094
bool test_any(bool(&fcn)(const T &)) const
Definition: Sparse.h:674
T xelem(octave_idx_type n) const
Definition: Sparse.h:402
T & xelem(octave_idx_type i, octave_idx_type j)
Definition: Sparse.h:409
OCTAVE_API Sparse< T, Alloc > permute(const Array< octave_idx_type > &vec, bool inv=false) const
Definition: Sparse.cc:929
T & elem(octave_idx_type i, octave_idx_type j)
Definition: Sparse.h:462
OCTAVE_API void resize(octave_idx_type r, octave_idx_type c)
Definition: Sparse.cc:991
bool test_any(bool(&fcn)(T)) const
Definition: Sparse.h:671
T * data(void) const
Definition: Sparse.h:581
bool issquare(void) const
Definition: Sparse.h:568
T * xdata(void)
Definition: Sparse.h:576
octave_idx_type * cidx(void) const
Definition: Sparse.h:607
OCTAVE_API void assign(const octave::idx_vector &i, const Sparse< T, Alloc > &rhs)
Definition: Sparse.cc:1879
octave_idx_type nnz(void) const
Actual number of nonzero terms.
Definition: Sparse.h:339
OCTAVE_API Array< T > array_value(void) const
Definition: Sparse.cc:2766
octave_idx_type * xridx(void)
Definition: Sparse.h:589
T & checkelem(octave_idx_type n)
Definition: Sparse.h:424
Sparse(octave_idx_type n)
Definition: Sparse.h:265
dim_vector dims(void) const
Definition: Sparse.h:371
octave_idx_type * ridx(void)
Definition: Sparse.h:583
OCTAVE_API Sparse< T, Alloc > index(const octave::idx_vector &i, bool resize_ok=false) const
Definition: Sparse.cc:1432
octave_idx_type get_row_index(octave_idx_type k)
Definition: Sparse.h:355
T & operator()(octave_idx_type n)
Definition: Sparse.h:471
Sparse< U > map(F fcn) const
Definition: Sparse.h:685
bool test_any(F fcn) const
Definition: Sparse.h:663
OCTAVE_API Sparse< T, Alloc > reshape(const dim_vector &new_dims) const
Definition: Sparse.cc:849
T element_type
Definition: Sparse.h:52
OCTAVE_API Sparse< T, Alloc > sort(octave_idx_type dim=0, sortmode mode=ASCENDING) const
Definition: Sparse.cc:2317
T checkelem(const Array< octave_idx_type > &ra_idx) const
Definition: Sparse.h:502
bool test(F fcn) const
Definition: Sparse.h:656
T & elem(octave_idx_type n)
Definition: Sparse.h:456
octave_idx_type ridx(octave_idx_type i) const
Definition: Sparse.h:592
OCTAVE_API Sparse< T, Alloc > diag(octave_idx_type k=0) const
Definition: Sparse.cc:2492
octave_idx_type & xridx(octave_idx_type i)
Definition: Sparse.h:590
octave_idx_type * cidx(void)
Definition: Sparse.h:596
T elem(octave_idx_type n) const
Definition: Sparse.h:512
T & checkelem(const Array< octave_idx_type > &ra_idx)
Definition: Sparse.h:446
bool test_all(bool(&fcn)(T)) const
Definition: Sparse.h:677
octave_idx_type * ridx(void) const
Definition: Sparse.h:594
Sparse(const Sparse< U > &a)
Definition: Sparse.h:303
octave_idx_type nzmax(void) const
Amount of storage for nonzero elements.
Definition: Sparse.h:336
T & elem(const Array< octave_idx_type > &ra_idx)
Definition: Sparse.h:468
Sparse< T, Alloc > ipermute(const Array< octave_idx_type > &vec) const
Definition: Sparse.h:545
octave_idx_type * xcidx(void)
Definition: Sparse.h:602
void make_unique(void)
Definition: Sparse.h:234
T data(octave_idx_type i) const
Definition: Sparse.h:579
bool test_all(bool(&fcn)(const T &)) const
Definition: Sparse.h:680
Sparse(const dim_vector &dv, octave_idx_type nz, T *ptr, octave_idx_type *ridx, octave_idx_type *cidx, const Alloc &xallocator=Alloc())
Definition: Sparse.h:290
bool isempty(void) const
Definition: Sparse.h:570
T & xdata(octave_idx_type i)
Definition: Sparse.h:577
T xelem(octave_idx_type i, octave_idx_type j) const
Definition: Sparse.h:410
Sparse< T, Alloc > maybe_compress(bool remove_zeros=false)
Definition: Sparse.h:531
octave_idx_type dim2(void) const
Definition: Sparse.h:349
T elem(octave_idx_type i, octave_idx_type j) const
Definition: Sparse.h:514
OCTAVE_API Sparse< T, Alloc > & operator=(const Sparse< T, Alloc > &a)
Definition: Sparse.cc:716
OCTAVE_API void delete_elements(const octave::idx_vector &i)
Definition: Sparse.cc:1196
Sparse(const Sparse< T, Alloc > &a)
Definition: Sparse.h:310
OCTAVE_API void resize1(octave_idx_type n)
Definition: Sparse.cc:958
T checkelem(octave_idx_type i, octave_idx_type j) const
Definition: Sparse.h:494
octave_idx_type cols(void) const
Definition: Sparse.h:352
T & xelem(const Array< octave_idx_type > &ra_idx)
Definition: Sparse.h:415
void change_capacity(octave_idx_type nz)
Definition: Sparse.h:556
Sparse(octave_idx_type nr, octave_idx_type nc)
Definition: Sparse.h:269
T & checkelem(octave_idx_type i, octave_idx_type j)
Definition: Sparse.h:435
OCTAVE_NORETURN OCTAVE_API T range_error(const char *fcn, octave_idx_type n) const
Definition: Sparse.cc:759
bool indices_ok(void) const
Definition: Sparse.h:749
dim_vector m_dimensions
Definition: Sparse.h:251
bool any_element_is_nan(void) const
Definition: Sparse.h:751
static OCTAVE_API Sparse< T, Alloc > cat(int dim, octave_idx_type n, const Sparse< T, Alloc > *sparse_list)
Definition: Sparse.cc:2666
Sparse< U > map(U(&fcn)(T)) const
Definition: Sparse.h:741
T & xelem(octave_idx_type n)
Definition: Sparse.h:395
octave_idx_type cidx(octave_idx_type i) const
Definition: Sparse.h:605
Sparse< T, Alloc >::SparseRep * m_rep
Definition: Sparse.h:249
octave_idx_type & cidx(octave_idx_type i)
Definition: Sparse.h:597
octave_idx_type numel(void) const
Definition: Sparse.h:343
octave_idx_type & xcidx(octave_idx_type i)
Definition: Sparse.h:603
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:94
octave_idx_type ndims(void) const
Number of dimensions.
Definition: dim-vector.h:257
OCTAVE_API octave_idx_type safe_numel(void) const
The following function will throw a std::bad_alloc () exception if the requested size is larger than ...
Definition: dim-vector.cc:98
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
#define OCTAVE_API
Definition: main.in.cc:55
void F(const TSRC *v, TRES *r, octave_idx_type m, octave_idx_type n)
Definition: mx-inlines.cc:757
sortmode
Definition: oct-sort.h:97
@ ASCENDING
Definition: oct-sort.h:97
T::size_type numel(const T &str)
Definition: oct-string.cc:71
const octave_base_value const Array< octave_idx_type > & ra_idx
static void transpose(octave_idx_type N, const octave_idx_type *ridx, const octave_idx_type *cidx, octave_idx_type *ridx2, octave_idx_type *cidx2)
Definition: symrcm.cc:391
F77_RET_T len
Definition: xerbla.cc:61