diff src/ov-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 a1ae2aae903e
children eb63fbe60fab
line wrap: on
line diff
--- 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)
 {