Mercurial > octave
view libinterp/corefcn/sparse-xpow.cc @ 16892:68fc671a9339
maint: Collapse interpfcn and interpfcn-core directories into corefcn directory.
* libgui/src/module.mk: Remove -I references to interp-core, interpfcn, add
reference to corefcn.
* libinterp/Makefile.am: Remove -I references to interp-core, interpfcn, add
reference to corefcn.
* libinterp/corefcn/module.mk: Add files from interp-core, interpfcn to
build system. Copy over special rules from module.mk files in interp-core
andd interpfcn.
* src/Makefile.am: Replace references to interp-core, interpfcn with those
to corefcn.
* libinterp/corefcn/Cell.cc, libinterp/corefcn/Cell.h,
libinterp/corefcn/action-container.h, libinterp/corefcn/c-file-ptr-stream.cc,
libinterp/corefcn/c-file-ptr-stream.h, libinterp/corefcn/comment-list.cc,
libinterp/corefcn/comment-list.h, libinterp/corefcn/cutils.c,
libinterp/corefcn/cutils.h, libinterp/corefcn/data.cc,
libinterp/corefcn/data.h, libinterp/corefcn/debug.cc,
libinterp/corefcn/debug.h, libinterp/corefcn/defaults.cc,
libinterp/corefcn/defaults.in.h, libinterp/corefcn/defun-dld.h,
libinterp/corefcn/defun-int.h, libinterp/corefcn/defun.cc,
libinterp/corefcn/defun.h, libinterp/corefcn/dirfns.cc,
libinterp/corefcn/dirfns.h, libinterp/corefcn/display.cc,
libinterp/corefcn/display.h, libinterp/corefcn/dynamic-ld.cc,
libinterp/corefcn/dynamic-ld.h, libinterp/corefcn/error.cc,
libinterp/corefcn/error.h, libinterp/corefcn/event-queue.h,
libinterp/corefcn/file-io.cc, libinterp/corefcn/file-io.h,
libinterp/corefcn/gl-render.cc, libinterp/corefcn/gl-render.h,
libinterp/corefcn/gl2ps-renderer.cc, libinterp/corefcn/gl2ps-renderer.h,
libinterp/corefcn/gl2ps.c, libinterp/corefcn/gl2ps.h,
libinterp/corefcn/graphics.cc, libinterp/corefcn/graphics.in.h,
libinterp/corefcn/gripes.cc, libinterp/corefcn/gripes.h,
libinterp/corefcn/help.cc, libinterp/corefcn/help.h,
libinterp/corefcn/hook-fcn.cc, libinterp/corefcn/hook-fcn.h,
libinterp/corefcn/input.cc, libinterp/corefcn/input.h,
libinterp/corefcn/jit-ir.cc, libinterp/corefcn/jit-ir.h,
libinterp/corefcn/jit-typeinfo.cc, libinterp/corefcn/jit-typeinfo.h,
libinterp/corefcn/jit-util.cc, libinterp/corefcn/jit-util.h,
libinterp/corefcn/load-path.cc, libinterp/corefcn/load-path.h,
libinterp/corefcn/load-save.cc, libinterp/corefcn/load-save.h,
libinterp/corefcn/ls-ascii-helper.cc, libinterp/corefcn/ls-ascii-helper.h,
libinterp/corefcn/ls-hdf5.cc, libinterp/corefcn/ls-hdf5.h,
libinterp/corefcn/ls-mat-ascii.cc, libinterp/corefcn/ls-mat-ascii.h,
libinterp/corefcn/ls-mat4.cc, libinterp/corefcn/ls-mat4.h,
libinterp/corefcn/ls-mat5.cc, libinterp/corefcn/ls-mat5.h,
libinterp/corefcn/ls-oct-ascii.cc, libinterp/corefcn/ls-oct-ascii.h,
libinterp/corefcn/ls-oct-binary.cc, libinterp/corefcn/ls-oct-binary.h,
libinterp/corefcn/ls-utils.cc, libinterp/corefcn/ls-utils.h,
libinterp/corefcn/matherr.c, libinterp/corefcn/mex.cc, libinterp/corefcn/mex.h,
libinterp/corefcn/mexproto.h, libinterp/corefcn/mxarray.in.h,
libinterp/corefcn/oct-errno.h, libinterp/corefcn/oct-errno.in.cc,
libinterp/corefcn/oct-fstrm.cc, libinterp/corefcn/oct-fstrm.h,
libinterp/corefcn/oct-hdf5.h, libinterp/corefcn/oct-hist.cc,
libinterp/corefcn/oct-hist.h, libinterp/corefcn/oct-iostrm.cc,
libinterp/corefcn/oct-iostrm.h, libinterp/corefcn/oct-lvalue.cc,
libinterp/corefcn/oct-lvalue.h, libinterp/corefcn/oct-map.cc,
libinterp/corefcn/oct-map.h, libinterp/corefcn/oct-obj.cc,
libinterp/corefcn/oct-obj.h, libinterp/corefcn/oct-prcstrm.cc,
libinterp/corefcn/oct-prcstrm.h, libinterp/corefcn/oct-procbuf.cc,
libinterp/corefcn/oct-procbuf.h, libinterp/corefcn/oct-stdstrm.h,
libinterp/corefcn/oct-stream.cc, libinterp/corefcn/oct-stream.h,
libinterp/corefcn/oct-strstrm.cc, libinterp/corefcn/oct-strstrm.h,
libinterp/corefcn/oct.h, libinterp/corefcn/octave-link.cc,
libinterp/corefcn/octave-link.h, libinterp/corefcn/pager.cc,
libinterp/corefcn/pager.h, libinterp/corefcn/pr-output.cc,
libinterp/corefcn/pr-output.h, libinterp/corefcn/procstream.cc,
libinterp/corefcn/procstream.h, libinterp/corefcn/profiler.cc,
libinterp/corefcn/profiler.h, libinterp/corefcn/pt-jit.cc,
libinterp/corefcn/pt-jit.h, libinterp/corefcn/sighandlers.cc,
libinterp/corefcn/sighandlers.h, libinterp/corefcn/siglist.c,
libinterp/corefcn/siglist.h, libinterp/corefcn/sparse-xdiv.cc,
libinterp/corefcn/sparse-xdiv.h, libinterp/corefcn/sparse-xpow.cc,
libinterp/corefcn/sparse-xpow.h, libinterp/corefcn/symtab.cc,
libinterp/corefcn/symtab.h, libinterp/corefcn/sysdep.cc,
libinterp/corefcn/sysdep.h, libinterp/corefcn/toplev.cc,
libinterp/corefcn/toplev.h, libinterp/corefcn/txt-eng-ft.cc,
libinterp/corefcn/txt-eng-ft.h, libinterp/corefcn/txt-eng.h,
libinterp/corefcn/unwind-prot.cc, libinterp/corefcn/unwind-prot.h,
libinterp/corefcn/utils.cc, libinterp/corefcn/utils.h,
libinterp/corefcn/variables.cc, libinterp/corefcn/variables.h,
libinterp/corefcn/workspace-element.h, libinterp/corefcn/xdiv.cc,
libinterp/corefcn/xdiv.h, libinterp/corefcn/xgl2ps.c,
libinterp/corefcn/xnorm.cc, libinterp/corefcn/xnorm.h,
libinterp/corefcn/xpow.cc, libinterp/corefcn/xpow.h,
libinterp/corefcn/zfstream.cc, libinterp/corefcn/zfstream.h:
Files moved from interp-core and interpfcn directories.
* libinterp/interp-core/Cell.cc, libinterp/interp-core/Cell.h,
libinterp/interp-core/action-container.h,
libinterp/interp-core/c-file-ptr-stream.cc,
libinterp/interp-core/c-file-ptr-stream.h,
libinterp/interp-core/comment-list.cc, libinterp/interp-core/comment-list.h,
libinterp/interp-core/cutils.c, libinterp/interp-core/cutils.h,
libinterp/interp-core/defun-dld.h, libinterp/interp-core/defun-int.h,
libinterp/interp-core/display.cc, libinterp/interp-core/display.h,
libinterp/interp-core/dynamic-ld.cc, libinterp/interp-core/dynamic-ld.h,
libinterp/interp-core/event-queue.h, libinterp/interp-core/gl-render.cc,
libinterp/interp-core/gl-render.h, libinterp/interp-core/gl2ps-renderer.cc,
libinterp/interp-core/gl2ps-renderer.h, libinterp/interp-core/gl2ps.c,
libinterp/interp-core/gl2ps.h, libinterp/interp-core/gripes.cc,
libinterp/interp-core/gripes.h, libinterp/interp-core/jit-ir.cc,
libinterp/interp-core/jit-ir.h, libinterp/interp-core/jit-typeinfo.cc,
libinterp/interp-core/jit-typeinfo.h, libinterp/interp-core/jit-util.cc,
libinterp/interp-core/jit-util.h, libinterp/interp-core/ls-ascii-helper.cc,
libinterp/interp-core/ls-ascii-helper.h, libinterp/interp-core/ls-hdf5.cc,
libinterp/interp-core/ls-hdf5.h, libinterp/interp-core/ls-mat-ascii.cc,
libinterp/interp-core/ls-mat-ascii.h, libinterp/interp-core/ls-mat4.cc,
libinterp/interp-core/ls-mat4.h, libinterp/interp-core/ls-mat5.cc,
libinterp/interp-core/ls-mat5.h, libinterp/interp-core/ls-oct-binary.cc,
libinterp/interp-core/ls-oct-binary.h, libinterp/interp-core/ls-utils.cc,
libinterp/interp-core/ls-utils.h, libinterp/interp-core/matherr.c,
libinterp/interp-core/mex.cc, libinterp/interp-core/mex.h,
libinterp/interp-core/mexproto.h, libinterp/interp-core/module.mk,
libinterp/interp-core/mxarray.in.h, libinterp/interp-core/oct-errno.h,
libinterp/interp-core/oct-errno.in.cc, libinterp/interp-core/oct-fstrm.cc,
libinterp/interp-core/oct-fstrm.h, libinterp/interp-core/oct-hdf5.h,
libinterp/interp-core/oct-iostrm.cc, libinterp/interp-core/oct-iostrm.h,
libinterp/interp-core/oct-lvalue.cc, libinterp/interp-core/oct-lvalue.h,
libinterp/interp-core/oct-map.cc, libinterp/interp-core/oct-map.h,
libinterp/interp-core/oct-obj.cc, libinterp/interp-core/oct-obj.h,
libinterp/interp-core/oct-prcstrm.cc, libinterp/interp-core/oct-prcstrm.h,
libinterp/interp-core/oct-procbuf.cc, libinterp/interp-core/oct-procbuf.h,
libinterp/interp-core/oct-stdstrm.h, libinterp/interp-core/oct-stream.cc,
libinterp/interp-core/oct-stream.h, libinterp/interp-core/oct-strstrm.cc,
libinterp/interp-core/oct-strstrm.h, libinterp/interp-core/oct.h,
libinterp/interp-core/procstream.cc, libinterp/interp-core/procstream.h,
libinterp/interp-core/pt-jit.cc, libinterp/interp-core/pt-jit.h,
libinterp/interp-core/siglist.c, libinterp/interp-core/siglist.h,
libinterp/interp-core/sparse-xdiv.cc, libinterp/interp-core/sparse-xdiv.h,
libinterp/interp-core/sparse-xpow.cc, libinterp/interp-core/sparse-xpow.h,
libinterp/interp-core/txt-eng-ft.cc, libinterp/interp-core/txt-eng-ft.h,
libinterp/interp-core/txt-eng.h, libinterp/interp-core/unwind-prot.cc,
libinterp/interp-core/unwind-prot.h, libinterp/interp-core/xdiv.cc,
libinterp/interp-core/xdiv.h, libinterp/interp-core/xgl2ps.c,
libinterp/interp-core/xnorm.cc, libinterp/interp-core/xnorm.h,
libinterp/interp-core/xpow.cc, libinterp/interp-core/xpow.h,
libinterp/interp-core/zfstream.cc, libinterp/interp-core/zfstream.h,
libinterp/interpfcn/data.cc, libinterp/interpfcn/data.h,
libinterp/interpfcn/debug.cc, libinterp/interpfcn/debug.h,
libinterp/interpfcn/defaults.cc, libinterp/interpfcn/defaults.in.h,
libinterp/interpfcn/defun.cc, libinterp/interpfcn/defun.h,
libinterp/interpfcn/dirfns.cc, libinterp/interpfcn/dirfns.h,
libinterp/interpfcn/error.cc, libinterp/interpfcn/error.h,
libinterp/interpfcn/file-io.cc, libinterp/interpfcn/file-io.h,
libinterp/interpfcn/graphics.cc, libinterp/interpfcn/graphics.in.h,
libinterp/interpfcn/help.cc, libinterp/interpfcn/help.h,
libinterp/interpfcn/hook-fcn.cc, libinterp/interpfcn/hook-fcn.h,
libinterp/interpfcn/input.cc, libinterp/interpfcn/input.h,
libinterp/interpfcn/load-path.cc, libinterp/interpfcn/load-path.h,
libinterp/interpfcn/load-save.cc, libinterp/interpfcn/load-save.h,
libinterp/interpfcn/ls-oct-ascii.cc, libinterp/interpfcn/ls-oct-ascii.h,
libinterp/interpfcn/module.mk, libinterp/interpfcn/oct-hist.cc,
libinterp/interpfcn/oct-hist.h, libinterp/interpfcn/octave-link.cc,
libinterp/interpfcn/octave-link.h, libinterp/interpfcn/pager.cc,
libinterp/interpfcn/pager.h, libinterp/interpfcn/pr-output.cc,
libinterp/interpfcn/pr-output.h, libinterp/interpfcn/profiler.cc,
libinterp/interpfcn/profiler.h, libinterp/interpfcn/sighandlers.cc,
libinterp/interpfcn/sighandlers.h, libinterp/interpfcn/symtab.cc,
libinterp/interpfcn/symtab.h, libinterp/interpfcn/sysdep.cc,
libinterp/interpfcn/sysdep.h, libinterp/interpfcn/toplev.cc,
libinterp/interpfcn/toplev.h, libinterp/interpfcn/utils.cc,
libinterp/interpfcn/utils.h, libinterp/interpfcn/variables.cc,
libinterp/interpfcn/variables.h, libinterp/interpfcn/workspace-element.h:
deleted files.
author | Rik <rik@octave.org> |
---|---|
date | Wed, 03 Jul 2013 17:43:48 -0700 |
parents | libinterp/interp-core/sparse-xpow.cc@d048ef58bb72 |
children | d63878346099 |
line wrap: on
line source
/* Copyright (C) 2004-2012 David Bateman Copyright (C) 1998-2004 Andy Adler This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <cassert> #include <limits> #include "Array-util.h" #include "oct-cmplx.h" #include "quit.h" #include "error.h" #include "oct-obj.h" #include "utils.h" #include "dSparse.h" #include "CSparse.h" #include "ov-re-sparse.h" #include "ov-cx-sparse.h" #include "sparse-xpow.h" static inline int xisint (double x) { return (D_NINT (x) == x && ((x >= 0 && x < std::numeric_limits<int>::max ()) || (x <= 0 && x > std::numeric_limits<int>::min ()))); } // Safer pow functions. Only two make sense for sparse matrices, the // others should all promote to full matrices. octave_value xpow (const SparseMatrix& a, double b) { octave_value retval; octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); if (nr == 0 || nc == 0 || nr != nc) error ("for A^b, A must be a square matrix"); else { if (static_cast<int> (b) == b) { int btmp = static_cast<int> (b); if (btmp == 0) { SparseMatrix tmp = SparseMatrix (nr, nr, nr); for (octave_idx_type i = 0; i < nr; i++) { tmp.data (i) = 1.0; tmp.ridx (i) = i; } for (octave_idx_type i = 0; i < nr + 1; i++) tmp.cidx (i) = i; retval = tmp; } else { SparseMatrix atmp; if (btmp < 0) { btmp = -btmp; octave_idx_type info; double rcond = 0.0; MatrixType mattyp (a); atmp = a.inverse (mattyp, info, rcond, 1); if (info == -1) warning ("inverse: matrix singular to machine\ precision, rcond = %g", rcond); } else atmp = a; SparseMatrix result (atmp); btmp--; while (btmp > 0) { if (btmp & 1) result = result * atmp; btmp >>= 1; if (btmp > 0) atmp = atmp * atmp; } retval = result; } } else error ("use full(a) ^ full(b)"); } return retval; } octave_value xpow (const SparseComplexMatrix& a, double b) { octave_value retval; octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); if (nr == 0 || nc == 0 || nr != nc) error ("for A^b, A must be a square matrix"); else { if (static_cast<int> (b) == b) { int btmp = static_cast<int> (b); if (btmp == 0) { SparseMatrix tmp = SparseMatrix (nr, nr, nr); for (octave_idx_type i = 0; i < nr; i++) { tmp.data (i) = 1.0; tmp.ridx (i) = i; } for (octave_idx_type i = 0; i < nr + 1; i++) tmp.cidx (i) = i; retval = tmp; } else { SparseComplexMatrix atmp; if (btmp < 0) { btmp = -btmp; octave_idx_type info; double rcond = 0.0; MatrixType mattyp (a); atmp = a.inverse (mattyp, info, rcond, 1); if (info == -1) warning ("inverse: matrix singular to machine\ precision, rcond = %g", rcond); } else atmp = a; SparseComplexMatrix result (atmp); btmp--; while (btmp > 0) { if (btmp & 1) result = result * atmp; btmp >>= 1; if (btmp > 0) atmp = atmp * atmp; } retval = result; } } else error ("use full(a) ^ full(b)"); } return retval; } // Safer pow functions that work elementwise for matrices. // // op2 \ op1: s m cs cm // +-- +---+---+----+----+ // scalar | | * | 3 | * | 9 | // +---+---+----+----+ // matrix | 1 | 4 | 7 | 10 | // +---+---+----+----+ // complex_scalar | * | 5 | * | 11 | // +---+---+----+----+ // complex_matrix | 2 | 6 | 8 | 12 | // +---+---+----+----+ // // * -> not needed. // FIXME -- these functions need to be fixed so that things // like // // a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b // // and // // a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end // // produce identical results. Also, it would be nice if -1^0.5 // produced a pure imaginary result instead of a complex number with a // small real part. But perhaps that's really a problem with the math // library... // Handle special case of scalar-sparse-matrix .^ sparse-matrix. // Forwarding to the scalar elem_xpow function and then converting the // result back to a sparse matrix is a bit wasteful but it does not // seem worth the effort to optimize -- how often does this case come up // in practice? template <class S, class SM> inline octave_value scalar_xpow (const S& a, const SM& b) { octave_value val = elem_xpow (a, b); if (val.is_complex_type ()) return SparseComplexMatrix (val.complex_matrix_value ()); else return SparseMatrix (val.matrix_value ()); } /* %!assert (sparse (2) .^ [3, 4], sparse ([8, 16])); %!assert (sparse (2i) .^ [3, 4], sparse ([-0-8i, 16])); */ // -*- 1 -*- octave_value elem_xpow (double a, const SparseMatrix& b) { octave_value retval; octave_idx_type nr = b.rows (); octave_idx_type nc = b.cols (); double d1, d2; if (a < 0.0 && ! b.all_integers (d1, d2)) { Complex atmp (a); ComplexMatrix result (nr, nc); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = 0; i < nr; i++) { octave_quit (); result(i, j) = std::pow (atmp, b(i,j)); } } retval = result; } else { Matrix result (nr, nc); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = 0; i < nr; i++) { octave_quit (); result(i, j) = std::pow (a, b(i,j)); } } retval = result; } return retval; } // -*- 2 -*- octave_value elem_xpow (double a, const SparseComplexMatrix& b) { octave_idx_type nr = b.rows (); octave_idx_type nc = b.cols (); Complex atmp (a); ComplexMatrix result (nr, nc); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = 0; i < nr; i++) { octave_quit (); result(i, j) = std::pow (atmp, b(i,j)); } } return result; } // -*- 3 -*- octave_value elem_xpow (const SparseMatrix& a, double b) { // FIXME What should a .^ 0 give?? Matlab gives a // sparse matrix with same structure as a, which is strictly // incorrect. Keep compatiability. octave_value retval; octave_idx_type nz = a.nnz (); if (b <= 0.0) { octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); if (static_cast<int> (b) != b && a.any_element_is_negative ()) { ComplexMatrix result (nr, nc, Complex (std::pow (0.0, b))); // FIXME -- avoid apparent GNU libm bug by // converting A and B to complex instead of just A. Complex btmp (b); for (octave_idx_type j = 0; j < nc; j++) for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); Complex atmp (a.data (i)); result(a.ridx (i), j) = std::pow (atmp, btmp); } retval = octave_value (result); } else { Matrix result (nr, nc, (std::pow (0.0, b))); for (octave_idx_type j = 0; j < nc; j++) for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); result(a.ridx (i), j) = std::pow (a.data (i), b); } retval = octave_value (result); } } else if (static_cast<int> (b) != b && a.any_element_is_negative ()) { SparseComplexMatrix result (a); for (octave_idx_type i = 0; i < nz; i++) { octave_quit (); // FIXME -- avoid apparent GNU libm bug by // converting A and B to complex instead of just A. Complex atmp (a.data (i)); Complex btmp (b); result.data (i) = std::pow (atmp, btmp); } result.maybe_compress (true); retval = result; } else { SparseMatrix result (a); for (octave_idx_type i = 0; i < nz; i++) { octave_quit (); result.data (i) = std::pow (a.data (i), b); } result.maybe_compress (true); retval = result; } return retval; } // -*- 4 -*- octave_value elem_xpow (const SparseMatrix& a, const SparseMatrix& b) { octave_value retval; octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); octave_idx_type b_nr = b.rows (); octave_idx_type b_nc = b.cols (); if (a.numel () == 1 && b.numel () > 1) return scalar_xpow (a(0), b); if (nr != b_nr || nc != b_nc) { gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); return octave_value (); } int convert_to_complex = 0; for (octave_idx_type j = 0; j < nc; j++) for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { if (a.data(i) < 0.0) { double btmp = b (a.ridx (i), j); if (static_cast<int> (btmp) != btmp) { convert_to_complex = 1; goto done; } } } done: // This is a dumb operator for sparse matrices anyway, and there is // no sensible way to handle the 0.^0 versus the 0.^x cases. Therefore // allocate a full matrix filled for the 0.^0 case and shrink it later // as needed if (convert_to_complex) { SparseComplexMatrix complex_result (nr, nc, Complex (1.0, 0.0)); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); complex_result.xelem (a.ridx (i), j) = std::pow (Complex (a.data (i)), Complex (b(a.ridx (i), j))); } } complex_result.maybe_compress (true); retval = complex_result; } else { SparseMatrix result (nr, nc, 1.0); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); result.xelem (a.ridx (i), j) = std::pow (a.data (i), b(a.ridx (i), j)); } } result.maybe_compress (true); retval = result; } return retval; } // -*- 5 -*- octave_value elem_xpow (const SparseMatrix& a, const Complex& b) { octave_value retval; if (b == 0.0) // Can this case ever happen, due to automatic retyping with maybe_mutate? retval = octave_value (NDArray (a.dims (), 1)); else { octave_idx_type nz = a.nnz (); SparseComplexMatrix result (a); for (octave_idx_type i = 0; i < nz; i++) { octave_quit (); result.data (i) = std::pow (Complex (a.data (i)), b); } result.maybe_compress (true); retval = result; } return retval; } // -*- 6 -*- octave_value elem_xpow (const SparseMatrix& a, const SparseComplexMatrix& b) { octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); octave_idx_type b_nr = b.rows (); octave_idx_type b_nc = b.cols (); if (a.numel () == 1 && b.numel () > 1) return scalar_xpow (a(0), b); if (nr != b_nr || nc != b_nc) { gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); return octave_value (); } SparseComplexMatrix result (nr, nc, Complex (1.0, 0.0)); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); result.xelem (a.ridx(i), j) = std::pow (a.data (i), b(a.ridx (i), j)); } } result.maybe_compress (true); return result; } // -*- 7 -*- octave_value elem_xpow (const Complex& a, const SparseMatrix& b) { octave_idx_type nr = b.rows (); octave_idx_type nc = b.cols (); ComplexMatrix result (nr, nc); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = 0; i < nr; i++) { octave_quit (); double btmp = b (i, j); if (xisint (btmp)) result (i, j) = std::pow (a, static_cast<int> (btmp)); else result (i, j) = std::pow (a, btmp); } } return result; } // -*- 8 -*- octave_value elem_xpow (const Complex& a, const SparseComplexMatrix& b) { octave_idx_type nr = b.rows (); octave_idx_type nc = b.cols (); ComplexMatrix result (nr, nc); for (octave_idx_type j = 0; j < nc; j++) for (octave_idx_type i = 0; i < nr; i++) { octave_quit (); result (i, j) = std::pow (a, b (i, j)); } return result; } // -*- 9 -*- octave_value elem_xpow (const SparseComplexMatrix& a, double b) { octave_value retval; if (b <= 0) { octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); ComplexMatrix result (nr, nc, Complex (std::pow (0.0, b))); if (xisint (b)) { for (octave_idx_type j = 0; j < nc; j++) for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); result (a.ridx (i), j) = std::pow (a.data (i), static_cast<int> (b)); } } else { for (octave_idx_type j = 0; j < nc; j++) for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); result (a.ridx (i), j) = std::pow (a.data (i), b); } } retval = result; } else { octave_idx_type nz = a.nnz (); SparseComplexMatrix result (a); if (xisint (b)) { for (octave_idx_type i = 0; i < nz; i++) { octave_quit (); result.data (i) = std::pow (a.data (i), static_cast<int> (b)); } } else { for (octave_idx_type i = 0; i < nz; i++) { octave_quit (); result.data (i) = std::pow (a.data (i), b); } } result.maybe_compress (true); retval = result; } return retval; } // -*- 10 -*- octave_value elem_xpow (const SparseComplexMatrix& a, const SparseMatrix& b) { octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); octave_idx_type b_nr = b.rows (); octave_idx_type b_nc = b.cols (); if (a.numel () == 1 && b.numel () > 1) return scalar_xpow (a(0), b); if (nr != b_nr || nc != b_nc) { gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); return octave_value (); } SparseComplexMatrix result (nr, nc, Complex (1.0, 0.0)); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); double btmp = b(a.ridx (i), j); Complex tmp; if (xisint (btmp)) result.xelem (a.ridx (i), j) = std::pow (a.data (i), static_cast<int> (btmp)); else result.xelem (a.ridx (i), j) = std::pow (a.data (i), btmp); } } result.maybe_compress (true); return result; } // -*- 11 -*- octave_value elem_xpow (const SparseComplexMatrix& a, const Complex& b) { octave_value retval; if (b == 0.0) // Can this case ever happen, due to automatic retyping with maybe_mutate? retval = octave_value (NDArray (a.dims (), 1)); else { octave_idx_type nz = a.nnz (); SparseComplexMatrix result (a); for (octave_idx_type i = 0; i < nz; i++) { octave_quit (); result.data (i) = std::pow (a.data (i), b); } result.maybe_compress (true); retval = result; } return retval; } // -*- 12 -*- octave_value elem_xpow (const SparseComplexMatrix& a, const SparseComplexMatrix& b) { octave_idx_type nr = a.rows (); octave_idx_type nc = a.cols (); octave_idx_type b_nr = b.rows (); octave_idx_type b_nc = b.cols (); if (a.numel () == 1 && b.numel () > 1) return scalar_xpow (a(0), b); if (nr != b_nr || nc != b_nc) { gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); return octave_value (); } SparseComplexMatrix result (nr, nc, Complex (1.0, 0.0)); for (octave_idx_type j = 0; j < nc; j++) { for (octave_idx_type i = a.cidx (j); i < a.cidx (j+1); i++) { octave_quit (); result.xelem (a.ridx (i), j) = std::pow (a.data (i), b(a.ridx (i), j)); } } result.maybe_compress (true); return result; }