Mercurial > hg > octave-lyh
diff liboctave/dSparse.cc @ 7503:8c32f95c2639
convert mapper functions to new format
author | David Bateman <dbateman@free.fr> |
---|---|
date | Wed, 20 Feb 2008 04:22:50 -0500 |
parents | 29980c6b8604 |
children | f3c00dc0912b |
line wrap: on
line diff
--- a/liboctave/dSparse.cc +++ b/liboctave/dSparse.cc @@ -7214,113 +7214,6 @@ // other operations. -SparseMatrix -SparseMatrix::map (d_d_Mapper f) const -{ - octave_idx_type nr = rows (); - octave_idx_type nc = cols (); - octave_idx_type nz = nnz (); - bool f_zero = (f(0.0) == 0.0); - - // Count number of non-zero elements - octave_idx_type nel = (f_zero ? 0 : nr*nc - nz); - for (octave_idx_type i = 0; i < nz; i++) - if (f (data(i)) != 0.0) - nel++; - - SparseMatrix retval (nr, nc, nel); - - if (f_zero) - { - octave_idx_type ii = 0; - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = 0; i < nr; i++) - { - double tmp = f (elem (i, j)); - if (tmp != 0.0) - { - retval.data(ii) = tmp; - retval.ridx(ii++) = i; - } - } - retval.cidx(j+1) = ii; - } - } - else - { - octave_idx_type ii = 0; - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = cidx(j); i < cidx(j+1); i++) - { - retval.data(ii) = f (elem(i)); - retval.ridx(ii++) = ridx(i); - } - retval.cidx(j+1) = ii; - } - } - - return retval; -} - -SparseBoolMatrix -SparseMatrix::map (b_d_Mapper f) const -{ - octave_idx_type nr = rows (); - octave_idx_type nc = cols (); - octave_idx_type nz = nnz (); - bool f_zero = f(0.0); - - // Count number of non-zero elements - octave_idx_type nel = (f_zero ? 0 : nr*nc - nz); - for (octave_idx_type i = 0; i < nz; i++) - if (f (data(i)) != 0.0) - nel++; - - SparseBoolMatrix retval (nr, nc, nel); - - if (f_zero) - { - octave_idx_type ii = 0; - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = 0; i < nr; i++) - { - bool tmp = f (elem (i, j)); - if (tmp) - { - retval.data(ii) = tmp; - retval.ridx(ii++) = i; - } - } - retval.cidx(j+1) = ii; - } - } - else - { - octave_idx_type ii = 0; - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = cidx(j); i < cidx(j+1); i++) - { - retval.data(ii) = f (elem(i)); - retval.ridx(ii++) = ridx(i); - } - retval.cidx(j+1) = ii; - } - } - - return retval; -} - -SparseMatrix& -SparseMatrix::apply (d_d_Mapper f) -{ - *this = map (f); - return *this; -} - bool SparseMatrix::any_element_is_negative (bool neg_zero) const { @@ -7641,6 +7534,169 @@ return retval; } +SparseMatrix +SparseMatrix::map (dmapper fcn) const +{ + SparseMatrix result; + double f_zero = fcn (0.); + + if (f_zero != 0.) + { + octave_idx_type nr = rows (); + octave_idx_type nc = cols (); + + result = SparseMatrix (nr, nc, f_zero); + + for (octave_idx_type j = 0; j < nc; j++) + for (octave_idx_type i = cidx(j); i < cidx (j+1); i++) + { + OCTAVE_QUIT; + /* Use data instead of elem for better performance. */ + result.data (ridx (i) + j * nr) = fcn (data(i)); + } + + result.maybe_compress (true); + } + else + { + octave_idx_type nz = nnz (); + octave_idx_type nr = rows (); + octave_idx_type nc = cols (); + + result = SparseMatrix (nr, nc, nz); + octave_idx_type ii = 0; + result.cidx (ii) = 0; + + for (octave_idx_type j = 0; j < nc; j++) + { + for (octave_idx_type i = cidx(j); i < cidx (j+1); i++) + { + double val = fcn (data (i)); + if (val != 0.0) + { + result.data (ii) = val; + result.ridx (ii++) = ridx (i); + } + OCTAVE_QUIT; + } + result.cidx (j+1) = ii; + } + + result.maybe_compress (false); + } + + return result; +} + +SparseComplexMatrix +SparseMatrix::map (cmapper fcn) const +{ + SparseComplexMatrix result; + Complex f_zero = fcn (0.); + + if (f_zero != 0.) + { + octave_idx_type nr = rows (); + octave_idx_type nc = cols (); + + result = SparseComplexMatrix (nr, nc, f_zero); + + for (octave_idx_type j = 0; j < nc; j++) + for (octave_idx_type i = cidx(j); i < cidx (j+1); i++) + { + OCTAVE_QUIT; + /* Use data instead of elem for better performance. */ + result.data (ridx (i) + j * nr) = fcn (Complex (data(i), 0.0)); + } + + result.maybe_compress (true); + } + else + { + octave_idx_type nz = nnz (); + octave_idx_type nr = rows (); + octave_idx_type nc = cols (); + + result = SparseComplexMatrix (nr, nc, nz); + Complex zero = Complex (0.0, 0.0); + octave_idx_type ii = 0; + result.cidx (ii) = 0; + + for (octave_idx_type j = 0; j < nc; j++) + { + for (octave_idx_type i = cidx(j); i < cidx (j+1); i++) + { + Complex val = fcn (Complex (data (i), 0.0)); + if (val != zero) + { + result.data (ii) = val; + result.ridx (ii++) = ridx (i); + } + OCTAVE_QUIT; + } + result.cidx (j+1) = ii; + } + + result.maybe_compress (false); + } + + return result; +} + +SparseBoolMatrix +SparseMatrix::map (bmapper fcn) const +{ + SparseBoolMatrix result; + bool f_zero = fcn (0.); + + if (f_zero) + { + octave_idx_type nr = rows (); + octave_idx_type nc = cols (); + + result = SparseBoolMatrix (nr, nc, f_zero); + + for (octave_idx_type j = 0; j < nc; j++) + for (octave_idx_type i = cidx(j); i < cidx (j+1); i++) + { + OCTAVE_QUIT; + /* Use data instead of elem for better performance. */ + result.data (ridx (i) + j * nr) = fcn (data(i)); + } + + result.maybe_compress (true); + } + else + { + octave_idx_type nz = nnz (); + octave_idx_type nr = rows (); + octave_idx_type nc = cols (); + + result = SparseBoolMatrix (nr, nc, nz); + octave_idx_type ii = 0; + result.cidx (ii) = 0; + + for (octave_idx_type j = 0; j < nc; j++) + { + for (octave_idx_type i = cidx(j); i < cidx (j+1); i++) + { + bool val = fcn (data (i)); + if (val) + { + result.data (ii) = val; + result.ridx (ii++) = ridx (i); + } + OCTAVE_QUIT; + } + result.cidx (j+1) = ii; + } + + result.maybe_compress (false); + } + + return result; +} + std::ostream& operator << (std::ostream& os, const SparseMatrix& a) {