Mercurial > octave
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;