21 #include <gtest/gtest.h> 32 #define CHECK_AND_RET_ERROR(_COND_,_MSG_) EXPECT_FALSE(_COND_) << _MSG_; 37 const double dat_A[] = {-0.710681653571291,0.734469323344333,-0.656414638791893,0.818771495864303,1.044946492154568,1.163592359608108,-1.069421407670914,0.307916381104872,0.185595851677470,0.116899590868673,0.507691343481809,-3.217842384231890,-0.214383515646621,-0.161495561253269,1.303923696836841,0.261535721431038};
40 const double dat_AInv[] = {-0.741952742824035,0.493481687552705,-0.134764164880760,0.083693424291000,0.638324207063440,0.519344439204238,0.264483337145361,0.644307267615193,-0.037800456163779,0.131794126194075,0.070338431705792,0.828591793299072,-0.025568212209135,0.068123300450057,-0.297834184749986,0.158964059763645};
47 const double dat_A[] = {363.769989013671875,0.000000000000000,316.429992675781250,0.000000000000000,87.266998291015625,0.000000000000000,101.540000915527344,0.000000000000000,478.709991455078125,0.000000000000000,504.540008544921875,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,363.769989013671875,0.000000000000000,316.429992675781250,0.000000000000000,87.266998291015625,0.000000000000000,101.540000915527344,0.000000000000000,478.709991455078125,0.000000000000000,504.540008544921875,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000};
51 const double dat_AInv[] = {-0.000303131460181,-0.002689371550382,1.383348917627708,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-0.000303131460181,-0.002689371550382,1.383348917627708,0.004729457992255,0.003244936115630,-2.049925698035195,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.004729457992255,0.003244936115630,-2.049925698035195,-0.004426326532074,-0.000555564565248,1.666576780407488,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-0.004426326532074,-0.000555564565248,1.666576780407488};
58 const double dat_A[] = {363.769989013671875,0.000000000000000,316.429992675781250,0.000000000000000,87.266998291015625,0.000000000000000,101.540000915527344,0.000000000000000,478.709991455078125,0.000000000000000,504.540008544921875,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,363.769989013671875,0.000000000000000,316.429992675781250,0.000000000000000,87.266998291015625,0.000000000000000,101.540000915527344,0.000000000000000,478.709991455078125,0.000000000000000,504.540008544921875,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000};
61 const double dat_AInv[] = {-0.000303131460181,-0.002689371550382,1.383348917627708,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-0.000303131460181,-0.002689371550382,1.383348917627708,0.004729457992255,0.003244936115630,-2.049925698035195,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.004729457992255,0.003244936115630,-2.049925698035195,-0.004426326532074,-0.000555564565248,1.666576780407488,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-0.004426326532074,-0.000555564565248,1.666576780407488};
68 const double dat_A[] = {
71 const double dat_At[] = {
80 EXPECT_EQ(A.t().t(), A);
86 const double dat_A[] = {
90 const std::vector<double>
v = make_vector<3>(1.0,2.0,3.0);
94 R.multiply_A_skew3(A,
v);
95 EXPECT_EQ(
R, (A*S).eval() );
98 const double dat_A[] = {
101 const double dat_v[] = { 1,2,3 };
107 R.multiply_A_skew3(A,
v);
108 EXPECT_TRUE(
R== A*S );
115 const double dat_A[] = {
120 const std::vector<double>
v = make_vector<3>(1.0,2.0,3.0);
124 R.multiply_skew3_A(
v,A);
125 EXPECT_TRUE(
R == S*A );
128 const double dat_A[] = {
132 const double dat_v[] = { 1,2,3 };
138 R.multiply_skew3_A(
v,A);
139 EXPECT_TRUE(
R == S*A );
146 const char* mat1 =
"[1 2 3;-3 -6 -5]";
147 const double vals1[] = {1,2,3,-3,-6,-5};
149 const char* mat2 =
" [ -8.2 9.232 ; -2e+2 +6 ; 1.000 7 ] ";
150 const double vals2[] = {-8.2, 9.232, -2e+2, +6, 1.000 ,7};
152 const char* mat3 =
"[9]";
153 const char* mat4 =
"[1 2 3 4 5 6 7 9 10 ; 1 2 3 4 5 6 7 8 9 10 11]";
154 const char* mat5 =
"[ ]";
155 const char* mat6 =
"[ -405.200 42.232 ; 1219.600 -98.696 ]";
157 const char* mat13 =
"[9 8 7]";
158 const char* mat31 =
"[9; 8; 7]";
162 if (! M1.fromMatlabStringFormat(mat1) ||
164 GTEST_FAIL() << mat1;
168 if (! M1b.fromMatlabStringFormat(mat1) ||
170 GTEST_FAIL() << mat1;
173 if (! M2.fromMatlabStringFormat(mat2) ||
174 M2.cols()!=2 || M2.rows()!=3 ||
176 GTEST_FAIL() << mat2;
180 if (! M2b.fromMatlabStringFormat(mat2) ||
182 GTEST_FAIL() << mat2;
185 if (! M3.fromMatlabStringFormat(mat3) )
186 GTEST_FAIL() << mat3;
190 if (! m.fromMatlabStringFormat(mat3) || m.size()!=1 ) GTEST_FAIL() <<
"CVectorDouble:" << mat3;
194 if (! m.fromMatlabStringFormat(mat3) ) GTEST_FAIL() <<
"CArrayDouble<1>:" << mat3;
199 if (! m.fromMatlabStringFormat(mat31) || m.size()!=3 ) GTEST_FAIL() <<
"CVectorDouble:" << mat31;
203 if (! m.fromMatlabStringFormat(mat31) ) GTEST_FAIL() <<
"CArrayDouble<3>:" << mat31;
207 Eigen::Matrix<double,1,3> m;
208 if (! m.fromMatlabStringFormat(mat13) ) GTEST_FAIL() <<
"Matrix<double,1,3>:" << mat13;
211 Eigen::Matrix<double,1,Eigen::Dynamic> m;
212 if (! m.fromMatlabStringFormat(mat13) || m.size()!=3 ) GTEST_FAIL() <<
"Matrix<double,1,Dynamic>:" << mat13;
216 if ( M4.fromMatlabStringFormat(mat4, NULL ) )
217 GTEST_FAIL() << mat4;
219 if (! M5.fromMatlabStringFormat(mat5) ||
size(M5,1)!=0 ||
size(M5,2)!=0 )
220 GTEST_FAIL() << mat5;
222 if (! M6.fromMatlabStringFormat(mat6) )
223 GTEST_FAIL() << mat6;
228 EXPECT_NEAR(0,(M6 - M1*M2).array().
square().
sum(), 1e-3);
A namespace of pseudo-random numbers genrators of diferent distributions.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
void skew_symmetric3(const VECTOR &v, MATRIX &M)
Computes the 3x3 skew symmetric matrix from a 3-vector or 3-array: .
TEST(Matrices, inv_4x4_fix)
void multiply_skew3_A(const SKEW_3VECTOR &v, const MAT_A &A)
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction...
This file implements miscelaneous matrix and matrix/vector operations, and internal functions in mrpt...
T square(const T x)
Inline function for the square of a number.
void multiply_A_skew3(const MAT_A &A, const SKEW_3VECTOR &v)
bool BASE_IMPEXP isNaN(float f) MRPT_NO_THROWS
Returns true if the number is NaN.
A numeric matrix of compile-time fixed size.
This base provides a set of functions for maths stuff.
CMatrixTemplateNumeric< double > CMatrixDouble
Declares a matrix of double numbers (non serializable).
CONTAINER::Scalar sum(const CONTAINER &v)
Computes the sum of all the elements.
bool BASE_IMPEXP isFinite(float f) MRPT_NO_THROWS
Returns true if the number is non infinity.
GLsizei GLboolean transpose
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
bool fromMatlabStringFormat(const std::string &s, std::ostream *dump_errors_here=NULL)
Read a matrix from a string in Matlab-like format, for example "[1 0 2; 0 4 -1]" The string must star...
#define CHECK_AND_RET_ERROR(_COND_, _MSG_)