aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/SVD1
-rw-r--r--Eigen/src/Core/BandMatrix.h18
-rw-r--r--Eigen/src/Householder/HouseholderSequence.h8
-rw-r--r--Eigen/src/QR/HouseholderQR.h2
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/householder.cpp2
-rw-r--r--test/qr.cpp2
7 files changed, 21 insertions, 13 deletions
diff --git a/Eigen/SVD b/Eigen/SVD
index 200aea351..0152b1e7e 100644
--- a/Eigen/SVD
+++ b/Eigen/SVD
@@ -25,6 +25,7 @@ namespace Eigen {
#include "src/misc/Solve.h"
#include "src/SVD/SVD.h"
#include "src/SVD/JacobiSVD.h"
+#include "src/SVD/UpperBidiagonalization.h"
} // namespace Eigen
diff --git a/Eigen/src/Core/BandMatrix.h b/Eigen/src/Core/BandMatrix.h
index 7943e6280..67684eca3 100644
--- a/Eigen/src/Core/BandMatrix.h
+++ b/Eigen/src/Core/BandMatrix.h
@@ -171,15 +171,21 @@ class BandMatrix : public AnyMatrixBase<BandMatrix<_Scalar,Rows,Cols,Supers,Subs
return Block<DataType,1,Dynamic>(m_data, supers()-i, std::max(0,i), 1, diagonalLength(i));
}
- DenseMatrixType toDenseMatrix() const
+ template<typename Dest> inline void evalTo(Dest& dst) const
{
- DenseMatrixType res(rows(),cols());
- res.setZero();
- res.diagonal() = diagonal();
+ dst.resize(rows(),cols());
+ dst.setZero();
+ dst.diagonal() = diagonal();
for (int i=1; i<=supers();++i)
- res.diagonal(i) = diagonal(i);
+ dst.diagonal(i) = diagonal(i);
for (int i=1; i<=subs();++i)
- res.diagonal(-i) = diagonal(-i);
+ dst.diagonal(-i) = diagonal(-i);
+ }
+
+ DenseMatrixType toDenseMatrix() const
+ {
+ DenseMatrixType res(rows(),cols());
+ evalTo(res);
return res;
}
diff --git a/Eigen/src/Householder/HouseholderSequence.h b/Eigen/src/Householder/HouseholderSequence.h
index 26e0f6a88..ecdf903a1 100644
--- a/Eigen/src/Householder/HouseholderSequence.h
+++ b/Eigen/src/Householder/HouseholderSequence.h
@@ -105,10 +105,10 @@ template<typename VectorsType, typename CoeffsType> class HouseholderSequence
{
if(m_trans)
dst.corner(BottomRight, length-k, length-k)
- .applyHouseholderOnTheRight(m_vectors.col(k).tail(length-k-1), m_coeffs.coeff(k), &temp.coeffRef(0));
+ .applyHouseholderOnTheRight(m_vectors.col(k).tail(length-k-1), m_coeffs.coeff(k), &temp.coeffRef(0));
else
dst.corner(BottomRight, length-k, length-k)
- .applyHouseholderOnTheLeft(m_vectors.col(k).tail(length-k-1), m_coeffs.coeff(k), &temp.coeffRef(k));
+ .applyHouseholderOnTheLeft(m_vectors.col(k).tail(length-k-1), m_coeffs.coeff(k), &temp.coeffRef(k));
}
}
@@ -121,7 +121,7 @@ template<typename VectorsType, typename CoeffsType> class HouseholderSequence
for(int k = 0; k < vecs; ++k)
{
int actual_k = m_trans ? vecs-k-1 : k;
- dst.corner(BottomRight, dst.rows(), length-actual_k)
+ dst.block(0, dst.cols()-length, dst.rows(), length-actual_k)
.applyHouseholderOnTheRight(m_vectors.col(actual_k).tail(length-actual_k-1), m_coeffs.coeff(actual_k), &temp.coeffRef(0));
}
}
@@ -135,7 +135,7 @@ template<typename VectorsType, typename CoeffsType> class HouseholderSequence
for(int k = 0; k < vecs; ++k)
{
int actual_k = m_trans ? k : vecs-k-1;
- dst.corner(BottomRight, length-actual_k, dst.cols())
+ dst.block(dst.rows()-length, 0, length-actual_k, dst.cols())
.applyHouseholderOnTheLeft(m_vectors.col(actual_k).tail(length-actual_k-1), m_coeffs.coeff(actual_k), &temp.coeffRef(0));
}
}
diff --git a/Eigen/src/QR/HouseholderQR.h b/Eigen/src/QR/HouseholderQR.h
index 3afaed9e0..49ee1fa79 100644
--- a/Eigen/src/QR/HouseholderQR.h
+++ b/Eigen/src/QR/HouseholderQR.h
@@ -55,7 +55,7 @@ template<typename _MatrixType> class HouseholderQR
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
Options = MatrixType::Options,
- DiagSizeAtCompileTime = EIGEN_ENUM_MIN(ColsAtCompileTime,RowsAtCompileTime)
+ DiagSizeAtCompileTime = EIGEN_SIZE_MIN(ColsAtCompileTime,RowsAtCompileTime)
};
typedef typename MatrixType::Scalar Scalar;
typedef typename MatrixType::RealScalar RealScalar;
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index e82026ee9..803434748 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -133,6 +133,7 @@ ei_add_test(hessenberg " " "${GSL_LIBRARIES}")
ei_add_test(eigensolver_selfadjoint " " "${GSL_LIBRARIES}")
ei_add_test(eigensolver_generic " " "${GSL_LIBRARIES}")
ei_add_test(eigensolver_complex)
+ei_add_test(upperbidiagonalization)
ei_add_test(svd)
ei_add_test(jacobisvd)
ei_add_test(geo_orthomethods)
diff --git a/test/householder.cpp b/test/householder.cpp
index 85492cdff..4e4c78863 100644
--- a/test/householder.cpp
+++ b/test/householder.cpp
@@ -79,7 +79,7 @@ template<typename MatrixType> void householder(const MatrixType& m)
m3.rowwise() = v1.transpose();
m4 = m3;
m3.row(0).makeHouseholder(essential, beta, alpha);
- m3.applyHouseholderOnTheRight(essential.transpose(),beta,tmp);
+ m3.applyHouseholderOnTheRight(essential,beta,tmp);
VERIFY_IS_APPROX(m3.norm(), m4.norm());
VERIFY_IS_MUCH_SMALLER_THAN(m3.block(0,1,rows,rows-1).norm(), m3.norm());
VERIFY_IS_MUCH_SMALLER_THAN(ei_imag(m3(0,0)), ei_real(m3(0,0)));
diff --git a/test/qr.cpp b/test/qr.cpp
index 3848ce0a5..7a808d049 100644
--- a/test/qr.cpp
+++ b/test/qr.cpp
@@ -114,7 +114,7 @@ template<typename MatrixType> void qr_verify_assert()
void test_qr()
{
- for(int i = 0; i < 1; i++) {
+ for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST_1( qr(MatrixXf(47,40)) );
CALL_SUBTEST_2( qr(MatrixXcd(17,7)) );
CALL_SUBTEST_3(( qr_fixedsize<Matrix<float,3,4>, 2 >() ));