Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "main.h"
00026 #include <Eigen/LU>
00027 #include <algorithm>
00028
00029 template<typename MatrixType> void inverse_permutation_4x4()
00030 {
00031 typedef typename MatrixType::Scalar Scalar;
00032 typedef typename MatrixType::RealScalar RealScalar;
00033 Vector4i indices(0,1,2,3);
00034 for(int i = 0; i < 24; ++i)
00035 {
00036 MatrixType m = PermutationMatrix<4>(indices);
00037 MatrixType inv = m.inverse();
00038 double error = double( (m*inv-MatrixType::Identity()).norm() / NumTraits<Scalar>::epsilon() );
00039 EIGEN_DEBUG_VAR(error)
00040 VERIFY(error == 0.0);
00041 std::next_permutation(indices.data(),indices.data()+4);
00042 }
00043 }
00044
00045 template<typename MatrixType> void inverse_general_4x4(int repeat)
00046 {
00047 typedef typename MatrixType::Scalar Scalar;
00048 typedef typename MatrixType::RealScalar RealScalar;
00049 double error_sum = 0., error_max = 0.;
00050 for(int i = 0; i < repeat; ++i)
00051 {
00052 MatrixType m;
00053 RealScalar absdet;
00054 do {
00055 m = MatrixType::Random();
00056 absdet = internal::abs(m.determinant());
00057 } while(absdet < NumTraits<Scalar>::epsilon());
00058 MatrixType inv = m.inverse();
00059 double error = double( (m*inv-MatrixType::Identity()).norm() * absdet / NumTraits<Scalar>::epsilon() );
00060 error_sum += error;
00061 error_max = std::max(error_max, error);
00062 }
00063 std::cerr << "inverse_general_4x4, Scalar = " << type_name<Scalar>() << std::endl;
00064 double error_avg = error_sum / repeat;
00065 EIGEN_DEBUG_VAR(error_avg);
00066 EIGEN_DEBUG_VAR(error_max);
00067
00068
00069 VERIFY(error_avg < (NumTraits<Scalar>::IsComplex ? 8.0 : 1.25));
00070 VERIFY(error_max < (NumTraits<Scalar>::IsComplex ? 64.0 : 20.0));
00071 }
00072
00073 void test_prec_inverse_4x4()
00074 {
00075 CALL_SUBTEST_1((inverse_permutation_4x4<Matrix4f>()));
00076 CALL_SUBTEST_1(( inverse_general_4x4<Matrix4f>(200000 * g_repeat) ));
00077
00078 CALL_SUBTEST_2((inverse_permutation_4x4<Matrix<double,4,4,RowMajor> >()));
00079 CALL_SUBTEST_2(( inverse_general_4x4<Matrix<double,4,4,RowMajor> >(200000 * g_repeat) ));
00080
00081 CALL_SUBTEST_3((inverse_permutation_4x4<Matrix4cf>()));
00082 CALL_SUBTEST_3((inverse_general_4x4<Matrix4cf>(50000 * g_repeat)));
00083 }