diff src/ov-flt-re-diag.cc @ 8834:8dd69187c4a2

specialize sqrt for diagonal matrices
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 20 Feb 2009 21:49:26 +0100
parents 095ae5e0a831
children eb63fbe60fab
line wrap: on
line diff
--- a/src/ov-flt-re-diag.cc
+++ b/src/ov-flt-re-diag.cc
@@ -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*/)