aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/QR/SelfAdjointEigenSolver.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-08-13 11:42:02 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-08-13 11:42:02 +0200
commit1b257a7620d122a05f71b6ebd52e14fe5f1b18ef (patch)
tree56b66ea6ea98e2bf6be7fb51c9c9f8d1dbb48205 /Eigen/src/QR/SelfAdjointEigenSolver.h
parent1d80f561ad48a96e9852dd8bfdbc400574aa67e5 (diff)
add an optimized "apply in place a rotation in the plane",
and make Jacobi and SelfAdjointEigenSolver use it => ~ x1.75 speedup for JacobiSVD and x2 for SelfAdjointEigenSolver
Diffstat (limited to 'Eigen/src/QR/SelfAdjointEigenSolver.h')
-rw-r--r--Eigen/src/QR/SelfAdjointEigenSolver.h17
1 files changed, 2 insertions, 15 deletions
diff --git a/Eigen/src/QR/SelfAdjointEigenSolver.h b/Eigen/src/QR/SelfAdjointEigenSolver.h
index b003fb4d7..a8e89ba1a 100644
--- a/Eigen/src/QR/SelfAdjointEigenSolver.h
+++ b/Eigen/src/QR/SelfAdjointEigenSolver.h
@@ -378,23 +378,10 @@ static void ei_tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, int st
if (matrixQ)
{
#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
+ ei_apply_rotation_in_the_plane_selector<Scalar,Dynamic>::run(matrixQ+k, matrixQ+k+1, n, c, s, n, n);
#else
- int kn = k*n;
- int kn1 = (k+1)*n;
+ ei_apply_rotation_in_the_plane_selector<Scalar,1>::run(matrixQ+k*n, matrixQ+k*n+n, n, c, s, 1, 1);
#endif
- // let's do the product manually to avoid the need of temporaries...
- for (int i=0; i<n; ++i)
- {
- #ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
- Scalar matrixQ_i_k = matrixQ[i*n+k];
- matrixQ[i*n+k] = c * matrixQ_i_k - s * matrixQ[i*n+k+1];
- matrixQ[i*n+k+1] = s * matrixQ_i_k + c * matrixQ[i*n+k+1];
- #else
- Scalar matrixQ_i_k = matrixQ[i+kn];
- matrixQ[i+kn] = c * matrixQ_i_k - s * matrixQ[i+kn1];
- matrixQ[i+kn1] = s * matrixQ_i_k + c * matrixQ[i+kn1];
- #endif
- }
}
}
}