# HG changeset patch # User Jaroslav Hajek # Date 1235162966 -3600 # Node ID 8dd69187c4a27e5bfc23a2882a6d93c4e7afe8d7 # Parent b86b42f77899b4131713ec747fbd826bcf24d833 specialize sqrt for diagonal matrices diff -r b86b42f77899 -r 8dd69187c4a2 src/ChangeLog --- a/src/ChangeLog Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ChangeLog Fri Feb 20 21:49:26 2009 +0100 @@ -1,3 +1,15 @@ +2009-02-20 Jaroslav Hajek + + * ov-base-diag.h (octave_base_diag::sqrt): Remove. + * ov-re-diag.cc (octave_diag_matrix::sqrt): New method. + * ov-re-diag.h: Declare it. + * ov-flt-re-diag.cc (octave_float_diag_matrix::sqrt): New method. + * ov-flt-re-diag.h: Declare it. + * ov-cx-diag.cc (octave_complex_diag_matrix::sqrt): New method. + * ov-cx-diag.h: Declare it. + * ov-flt-cx-diag.cc (octave_float_complex_diag_matrix::sqrt): New method. + * ov-flt-cx-diag.h: Declare it. + 2009-02-20 John W. Eaton * dynamic-ld.cc (octave_dynamic_loader::do_load_mex): Clear and diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-base-diag.cc --- a/src/ov-base-diag.cc Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-base-diag.cc Fri Feb 20 21:49:26 2009 +0100 @@ -579,7 +579,6 @@ FORWARD_MAPPER (signum) FORWARD_MAPPER (sin) FORWARD_MAPPER (sinh) -FORWARD_MAPPER (sqrt) FORWARD_MAPPER (tan) FORWARD_MAPPER (tanh) FORWARD_MAPPER (finite) diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-base-diag.h --- a/src/ov-base-diag.h Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-base-diag.h Fri Feb 20 21:49:26 2009 +0100 @@ -216,7 +216,7 @@ void print_info (std::ostream& os, const std::string& prefix) const; - // We forward everything except abs, real, imag, conj. + // We forward everything except abs, real, imag, conj, sqrt. octave_value erf (void) const; octave_value erfc (void) const; octave_value gamma (void) const; @@ -245,7 +245,6 @@ octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; - octave_value sqrt (void) const; octave_value tan (void) const; octave_value tanh (void) const; octave_value finite (void) const; diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-cx-diag.cc --- a/src/ov-cx-diag.cc Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-cx-diag.cc Fri Feb 20 21:49:26 2009 +0100 @@ -159,6 +159,21 @@ return ::imag (matrix); } +octave_value +octave_complex_diag_matrix::sqrt (void) const +{ + octave_value retval; + + static ComplexNDArray::cmapper csqrt = std::sqrt; + + ComplexColumnVector dvec = matrix.diag (); + retval = ComplexDiagMatrix (dvec.map (csqrt)); + + retval.resize (dims ()); + + return retval; +} + bool octave_complex_diag_matrix::save_binary (std::ostream& os, bool& save_as_floats) { diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-cx-diag.h --- a/src/ov-cx-diag.h Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-cx-diag.h Fri Feb 20 21:49:26 2009 +0100 @@ -82,6 +82,7 @@ octave_value conj (void) const; octave_value imag (void) const; octave_value real (void) const; + octave_value sqrt (void) const; private: diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-flt-cx-diag.cc --- a/src/ov-flt-cx-diag.cc Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-flt-cx-diag.cc Fri Feb 20 21:49:26 2009 +0100 @@ -143,6 +143,21 @@ return ::imag (matrix); } +octave_value +octave_float_complex_diag_matrix::sqrt (void) const +{ + octave_value retval; + + static FloatComplexNDArray::cmapper csqrt = std::sqrt; + + FloatComplexColumnVector dvec = matrix.diag (); + retval = FloatComplexDiagMatrix (dvec.map (csqrt)); + + retval.resize (dims ()); + + return retval; +} + bool octave_float_complex_diag_matrix::save_binary (std::ostream& os, bool& /* save_as_floats */) diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-flt-cx-diag.h --- a/src/ov-flt-cx-diag.h Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-flt-cx-diag.h Fri Feb 20 21:49:26 2009 +0100 @@ -80,6 +80,7 @@ octave_value conj (void) const; octave_value imag (void) const; octave_value real (void) const; + octave_value sqrt (void) const; private: diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-flt-re-diag.cc --- a/src/ov-flt-re-diag.cc Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-flt-re-diag.cc Fri Feb 20 21:49:26 2009 +0100 @@ -114,6 +114,25 @@ return DiagMatrix (matrix.rows (), matrix.cols (), 0.0f); } +octave_value +octave_float_diag_matrix::sqrt (void) const +{ + octave_value retval; + + static FloatNDArray::dmapper dsqrt = ::sqrtf; + static FloatNDArray::cmapper csqrt = std::sqrt; + + FloatColumnVector dvec = matrix.diag (); + if (FloatMatrix (dvec).any_element_is_negative ()) + retval = FloatComplexDiagMatrix (dvec.map (csqrt)); + else + retval = FloatDiagMatrix (dvec.map (dsqrt)); + + retval.resize (dims ()); + + return retval; +} + bool octave_float_diag_matrix::save_binary (std::ostream& os, bool& /* save_as_floats*/) diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-flt-re-diag.h --- a/src/ov-flt-re-diag.h Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-flt-re-diag.h Fri Feb 20 21:49:26 2009 +0100 @@ -80,6 +80,7 @@ octave_value conj (void) const; octave_value imag (void) const; octave_value real (void) const; + octave_value sqrt (void) const; private: diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-re-diag.cc --- a/src/ov-re-diag.cc Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-re-diag.cc Fri Feb 20 21:49:26 2009 +0100 @@ -129,6 +129,25 @@ return DiagMatrix (matrix.rows (), matrix.cols (), 0.0); } +octave_value +octave_diag_matrix::sqrt (void) const +{ + octave_value retval; + + static NDArray::dmapper dsqrt = ::sqrt; + static NDArray::cmapper csqrt = std::sqrt; + + ColumnVector dvec = matrix.diag (); + if (Matrix (dvec).any_element_is_negative ()) + retval = ComplexDiagMatrix (dvec.map (csqrt)); + else + retval = DiagMatrix (dvec.map (dsqrt)); + + retval.resize (dims ()); + + return retval; +} + bool octave_diag_matrix::save_binary (std::ostream& os, bool& save_as_floats) { diff -r b86b42f77899 -r 8dd69187c4a2 src/ov-re-diag.h --- a/src/ov-re-diag.h Fri Feb 20 15:23:47 2009 -0500 +++ b/src/ov-re-diag.h Fri Feb 20 21:49:26 2009 +0100 @@ -82,6 +82,7 @@ octave_value conj (void) const; octave_value imag (void) const; octave_value real (void) const; + octave_value sqrt (void) const; private: