diff src/xpow.cc @ 7578:91f8446ce4ae

handle possible error from EIG
author John W. Eaton <jwe@octave.org>
date Tue, 11 Mar 2008 10:49:33 -0400
parents b84c5cbc0812
children 82be108cc558 72830070a17b
line wrap: on
line diff
--- a/src/xpow.cc	Mon Mar 10 23:18:47 2008 -0400
+++ b/src/xpow.cc	Tue Mar 11 10:49:33 2008 -0400
@@ -101,20 +101,26 @@
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
 	{
-	  Complex elt = lambda (i);
-	  if (std::imag (elt) == 0.0)
-	    lambda (i) = std::pow (a, std::real (elt));
-	  else
-	    lambda (i) = std::pow (a, elt);
+	  ComplexColumnVector lambda (b_eig.eigenvalues ());
+	  ComplexMatrix Q (b_eig.eigenvectors ());
+
+	  for (octave_idx_type i = 0; i < nr; i++)
+	    {
+	      Complex elt = lambda(i);
+	      if (std::imag (elt) == 0.0)
+		lambda(i) = std::pow (a, std::real (elt));
+	      else
+		lambda(i) = std::pow (a, elt);
+	    }
+	  ComplexDiagMatrix D (lambda);
+
+	  retval = ComplexMatrix (Q * D * Q.inverse ());
 	}
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+	error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -144,20 +150,26 @@
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
 	{
-	  Complex elt = lambda (i);
-	  if (std::imag (elt) == 0.0)
-	    lambda (i) = std::pow (a, std::real (elt));
-	  else
-	    lambda (i) = std::pow (a, elt);
+	  ComplexColumnVector lambda (b_eig.eigenvalues ());
+	  ComplexMatrix Q (b_eig.eigenvectors ());
+
+	  for (octave_idx_type i = 0; i < nr; i++)
+	    {
+	      Complex elt = lambda(i);
+	      if (std::imag (elt) == 0.0)
+		lambda(i) = std::pow (a, std::real (elt));
+	      else
+		lambda(i) = std::pow (a, elt);
+	    }
+	  ComplexDiagMatrix D (lambda);
+
+	  retval = ComplexMatrix (Q * D * Q.inverse ());
 	}
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+	error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -228,15 +240,21 @@
       else
 	{
 	  EIG a_eig (a);
-	  ComplexColumnVector lambda (a_eig.eigenvalues ());
-	  ComplexMatrix Q (a_eig.eigenvectors ());
+
+	  if (! error_state)
+	    {
+	      ComplexColumnVector lambda (a_eig.eigenvalues ());
+	      ComplexMatrix Q (a_eig.eigenvectors ());
 
-	  for (octave_idx_type i = 0; i < nr; i++)
-	    lambda (i) = std::pow (lambda (i), b);
+	      for (octave_idx_type i = 0; i < nr; i++)
+		lambda(i) = std::pow (lambda(i), b);
+
+	      ComplexDiagMatrix D (lambda);
 
-	  ComplexDiagMatrix D (lambda);
-
-	  retval = ComplexMatrix (Q * D * Q.inverse ());
+	      retval = ComplexMatrix (Q * D * Q.inverse ());
+	    }
+	  else
+	    error ("xpow: matrix diagonalization failed");
 	}
     }
 
@@ -257,15 +275,21 @@
   else
     {
       EIG a_eig (a);
-      ComplexColumnVector lambda (a_eig.eigenvalues ());
-      ComplexMatrix Q (a_eig.eigenvectors ());
+
+      if (! error_state)
+	{
+	  ComplexColumnVector lambda (a_eig.eigenvalues ());
+	  ComplexMatrix Q (a_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
-	lambda (i) = std::pow (lambda (i), b);
+	  for (octave_idx_type i = 0; i < nr; i++)
+	    lambda(i) = std::pow (lambda(i), b);
+
+	  ComplexDiagMatrix D (lambda);
 
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+	  retval = ComplexMatrix (Q * D * Q.inverse ());
+	}
+      else
+	error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -299,20 +323,26 @@
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
 	{
-	  Complex elt = lambda (i);
-	  if (std::imag (elt) == 0.0)
-	    lambda (i) = std::pow (a, std::real (elt));
-	  else
-	    lambda (i) = std::pow (a, elt);
+	  ComplexColumnVector lambda (b_eig.eigenvalues ());
+	  ComplexMatrix Q (b_eig.eigenvectors ());
+
+	  for (octave_idx_type i = 0; i < nr; i++)
+	    {
+	      Complex elt = lambda(i);
+	      if (std::imag (elt) == 0.0)
+		lambda(i) = std::pow (a, std::real (elt));
+	      else
+		lambda(i) = std::pow (a, elt);
+	    }
+	  ComplexDiagMatrix D (lambda);
+
+	  retval = ComplexMatrix (Q * D * Q.inverse ());
 	}
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+	error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -341,20 +371,26 @@
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
 	{
-	  Complex elt = lambda (i);
-	  if (std::imag (elt) == 0.0)
-	    lambda (i) = std::pow (a, std::real (elt));
-	  else
-	    lambda (i) = std::pow (a, elt);
+	  ComplexColumnVector lambda (b_eig.eigenvalues ());
+	  ComplexMatrix Q (b_eig.eigenvectors ());
+
+	  for (octave_idx_type i = 0; i < nr; i++)
+	    {
+	      Complex elt = lambda(i);
+	      if (std::imag (elt) == 0.0)
+		lambda(i) = std::pow (a, std::real (elt));
+	      else
+		lambda(i) = std::pow (a, elt);
+	    }
+	  ComplexDiagMatrix D (lambda);
+
+	  retval = ComplexMatrix (Q * D * Q.inverse ());
 	}
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+	error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -425,15 +461,21 @@
       else
 	{
 	  EIG a_eig (a);
-	  ComplexColumnVector lambda (a_eig.eigenvalues ());
-	  ComplexMatrix Q (a_eig.eigenvectors ());
+
+	  if (! error_state)
+	    {
+	      ComplexColumnVector lambda (a_eig.eigenvalues ());
+	      ComplexMatrix Q (a_eig.eigenvectors ());
 
-	  for (octave_idx_type i = 0; i < nr; i++)
-	    lambda (i) = std::pow (lambda (i), b);
+	      for (octave_idx_type i = 0; i < nr; i++)
+		lambda(i) = std::pow (lambda(i), b);
+
+	      ComplexDiagMatrix D (lambda);
 
-	  ComplexDiagMatrix D (lambda);
-
-	  retval = ComplexMatrix (Q * D * Q.inverse ());
+	      retval = ComplexMatrix (Q * D * Q.inverse ());
+	    }
+	  else
+	    error ("xpow: matrix diagonalization failed");
 	}
     }
 
@@ -454,15 +496,21 @@
   else
     {
       EIG a_eig (a);
-      ComplexColumnVector lambda (a_eig.eigenvalues ());
-      ComplexMatrix Q (a_eig.eigenvectors ());
+
+      if (! error_state)
+	{
+	  ComplexColumnVector lambda (a_eig.eigenvalues ());
+	  ComplexMatrix Q (a_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
-	lambda (i) = std::pow (lambda (i), b);
+	  for (octave_idx_type i = 0; i < nr; i++)
+	    lambda(i) = std::pow (lambda(i), b);
+
+	  ComplexDiagMatrix D (lambda);
 
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+	  retval = ComplexMatrix (Q * D * Q.inverse ());
+	}
+      else
+	error ("xpow: matrix diagonalization failed");
     }
 
   return retval;