mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
* the 4th template param of Matrix is now Options. One bit for storage
order, one bit for enabling/disabling auto-alignment. If you want to disable, do: Matrix<float,4,1,Matrix_DontAlign> The Matrix_ prefix is the only way I can see to avoid ambiguity/pollution. The old RowMajor, ColMajor constants are deprecated, remain for now. * this prompted several improvements in matrix_storage. ei_aligned_array renamed to ei_matrix_array and moved there. The %16==0 tests are now much more centralized in 1 place there. * unalignedassert test: updated * update FindEigen2.cmake from KDElibs * determinant test: use VERIFY_IS_APPROX to fix false positives; add testing of 1 big matrix
This commit is contained in:
@@ -38,8 +38,8 @@ template<typename MatrixType> void determinant(const MatrixType& m)
|
||||
m2.setRandom();
|
||||
typedef typename MatrixType::Scalar Scalar;
|
||||
Scalar x = ei_random<Scalar>();
|
||||
VERIFY(ei_isApprox(MatrixType::Identity(size, size).determinant(), Scalar(1)));
|
||||
VERIFY(ei_isApprox((m1*m2).determinant(), m1.determinant() * m2.determinant()));
|
||||
VERIFY_IS_APPROX(MatrixType::Identity(size, size).determinant(), Scalar(1));
|
||||
VERIFY_IS_APPROX((m1*m2).determinant(), m1.determinant() * m2.determinant());
|
||||
if(size==1) return;
|
||||
int i = ei_random<int>(0, size-1);
|
||||
int j;
|
||||
@@ -48,18 +48,18 @@ template<typename MatrixType> void determinant(const MatrixType& m)
|
||||
} while(j==i);
|
||||
m2 = m1;
|
||||
m2.row(i).swap(m2.row(j));
|
||||
VERIFY(ei_isApprox(m2.determinant(), -m1.determinant()));
|
||||
VERIFY_IS_APPROX(m2.determinant(), -m1.determinant());
|
||||
m2 = m1;
|
||||
m2.col(i).swap(m2.col(j));
|
||||
VERIFY(ei_isApprox(m2.determinant(), -m1.determinant()));
|
||||
VERIFY(ei_isApprox(m2.determinant(), m2.transpose().determinant()));
|
||||
VERIFY(ei_isApprox(ei_conj(m2.determinant()), m2.adjoint().determinant()));
|
||||
VERIFY_IS_APPROX(m2.determinant(), -m1.determinant());
|
||||
VERIFY_IS_APPROX(m2.determinant(), m2.transpose().determinant());
|
||||
VERIFY_IS_APPROX(ei_conj(m2.determinant()), m2.adjoint().determinant());
|
||||
m2 = m1;
|
||||
m2.row(i) += x*m2.row(j);
|
||||
VERIFY(ei_isApprox(m2.determinant(), m1.determinant()));
|
||||
VERIFY_IS_APPROX(m2.determinant(), m1.determinant());
|
||||
m2 = m1;
|
||||
m2.row(i) *= x;
|
||||
VERIFY(ei_isApprox(m2.determinant(), m1.determinant() * x));
|
||||
VERIFY_IS_APPROX(m2.determinant(), m1.determinant() * x);
|
||||
}
|
||||
|
||||
void test_determinant()
|
||||
@@ -72,4 +72,5 @@ void test_determinant()
|
||||
CALL_SUBTEST( determinant(Matrix<std::complex<double>, 10, 10>()) );
|
||||
CALL_SUBTEST( determinant(MatrixXd(20, 20)) );
|
||||
}
|
||||
CALL_SUBTEST( determinant(MatrixXd(200, 200)) );
|
||||
}
|
||||
|
||||
@@ -67,6 +67,12 @@ struct Good8 : Eigen::WithAlignedOperatorNew
|
||||
Matrix4f m;
|
||||
};
|
||||
|
||||
struct Good9
|
||||
{
|
||||
Matrix<float,2,2,Matrix_DontAlign> m; // good: no alignment requested
|
||||
float f;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
void check_unalignedassert_good()
|
||||
{
|
||||
@@ -80,7 +86,7 @@ void check_unalignedassert_good()
|
||||
template<typename T>
|
||||
void check_unalignedassert_bad()
|
||||
{
|
||||
float buf[1000];
|
||||
float buf[sizeof(T)+16];
|
||||
float *unaligned = buf;
|
||||
while((reinterpret_cast<size_t>(unaligned)&0xf)==0) ++unaligned; // make sure unaligned is really unaligned
|
||||
T *x = new(static_cast<void*>(unaligned)) T;
|
||||
@@ -97,6 +103,7 @@ void unalignedassert()
|
||||
VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad6>());
|
||||
check_unalignedassert_good<Good7>();
|
||||
check_unalignedassert_good<Good8>();
|
||||
check_unalignedassert_good<Good9>();
|
||||
}
|
||||
|
||||
void test_unalignedassert()
|
||||
|
||||
Reference in New Issue
Block a user