Mercurial > octave-nkf
diff liboctave/CSparse.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/CSparse.cc Wed Feb 20 01:09:19 2008 -0500 +++ b/liboctave/CSparse.cc Wed Feb 20 04:22:50 2008 -0500 @@ -7177,163 +7177,6 @@ // other operations -SparseComplexMatrix -SparseComplexMatrix::map (c_c_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++; - - SparseComplexMatrix 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++) - { - Complex 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; -} - -SparseMatrix -SparseComplexMatrix::map (d_c_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 -SparseComplexMatrix::map (b_c_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; -} - -SparseComplexMatrix& -SparseComplexMatrix::apply (c_c_Mapper f) -{ - *this = map (f); - return *this; -} - bool SparseComplexMatrix::any_element_is_inf_or_nan (void) const { @@ -7599,6 +7442,169 @@ return d; } +SparseMatrix +SparseComplexMatrix::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 +SparseComplexMatrix::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 (data(i)); + } + + 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 (data (i)); + 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 +SparseComplexMatrix::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 SparseComplexMatrix& a) {