diff src/DLD-FUNCTIONS/qr.cc @ 8869:c3b743b1b1c6

preset triangular type if possible for lu and qr outputs
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 25 Feb 2009 09:10:38 +0100
parents 20dfb885f877
children 7c02ec148a3c
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/qr.cc	Wed Feb 25 03:02:28 2009 -0500
+++ b/src/DLD-FUNCTIONS/qr.cc	Wed Feb 25 09:10:38 2009 +0100
@@ -44,6 +44,29 @@
 #include "oct-obj.h"
 #include "utils.h"
 
+template <class MT>
+static octave_value
+maybe_set_triangular (const MT& m, MatrixType::matrix_type t = MatrixType::Upper)
+{
+  typedef typename MT::element_type T;
+  octave_value retval;
+  octave_idx_type r = m.rows (), c = m.columns ();
+  if (r == c)
+    {
+      const T zero = T();
+      octave_idx_type i = 0;
+      for (;i != r && m(i,i) != zero; i++) ;
+      if (i == r)
+        retval = octave_value (m, MatrixType (t));
+      else
+        retval = m;
+    }
+  else
+    retval = m;
+
+  return retval;
+}
+
 // [Q, R] = qr (X):      form Q unitary and R upper triangular such
 //                        that Q * R = X
 //
@@ -296,7 +319,7 @@
 		    case 2:
 		      {
 			FloatQR fact (m, type);
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -308,7 +331,7 @@
                           retval(2) = fact.Pvec ();
                         else
                           retval(2) = fact.P ();
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -334,7 +357,7 @@
 		    case 2:
 		      {
 			FloatComplexQR fact (m, type);
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -346,7 +369,7 @@
                           retval(2) = fact.Pvec ();
                         else
                           retval(2) = fact.P ();
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -375,7 +398,7 @@
 		    case 2:
 		      {
 			QR fact (m, type);
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -387,7 +410,7 @@
                           retval(2) = fact.Pvec ();
                         else
                           retval(2) = fact.P ();
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -413,7 +436,7 @@
 		    case 2:
 		      {
 			ComplexQR fact (m, type);
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;
@@ -425,7 +448,7 @@
                           retval(2) = fact.Pvec ();
                         else
                           retval(2) = fact.P ();
-			retval(1) = fact.R ();
+			retval(1) = maybe_set_triangular (fact.R ());
 			retval(0) = fact.Q ();
 		      }
 		      break;