20 #include <gtest/gtest.h> 27 #define CHECK_AND_RET_ERROR(_COND_, _MSG_) EXPECT_FALSE(_COND_) << _MSG_; 29 TEST(Matrices, inv_4x4_fix)
31 const double dat_A[] = {
32 -0.710681653571291, 0.734469323344333, -0.656414638791893,
33 0.818771495864303, 1.044946492154568, 1.163592359608108,
34 -1.069421407670914, 0.307916381104872, 0.185595851677470,
35 0.116899590868673, 0.507691343481809, -3.217842384231890,
36 -0.214383515646621, -0.161495561253269, 1.303923696836841,
40 const double dat_AInv[] = {
41 -0.741952742824035, 0.493481687552705, -0.134764164880760,
42 0.083693424291000, 0.638324207063440, 0.519344439204238,
43 0.264483337145361, 0.644307267615193, -0.037800456163779,
44 0.131794126194075, 0.070338431705792, 0.828591793299072,
45 -0.025568212209135, 0.068123300450057, -0.297834184749986,
49 (AInv - C).array().abs().
sum() > 1e-4,
"Error in inv, 4x4 fix")
52 TEST(Matrices, inv_6x6_fix)
54 const double dat_A[] = {
55 363.769989013671875, 0.000000000000000, 316.429992675781250,
56 0.000000000000000, 87.266998291015625, 0.000000000000000,
57 101.540000915527344, 0.000000000000000, 478.709991455078125,
58 0.000000000000000, 504.540008544921875, 0.000000000000000,
59 1.000000000000000, 0.000000000000000, 1.000000000000000,
60 0.000000000000000, 1.000000000000000, 0.000000000000000,
61 0.000000000000000, 363.769989013671875, 0.000000000000000,
62 316.429992675781250, 0.000000000000000, 87.266998291015625,
63 0.000000000000000, 101.540000915527344, 0.000000000000000,
64 478.709991455078125, 0.000000000000000, 504.540008544921875,
65 0.000000000000000, 1.000000000000000, 0.000000000000000,
66 1.000000000000000, 0.000000000000000, 1.000000000000000};
70 const double dat_AInv[] = {
71 -0.000303131460181, -0.002689371550382, 1.383348917627708,
72 0.000000000000000, 0.000000000000000, 0.000000000000000,
73 0.000000000000000, 0.000000000000000, 0.000000000000000,
74 -0.000303131460181, -0.002689371550382, 1.383348917627708,
75 0.004729457992255, 0.003244936115630, -2.049925698035195,
76 0.000000000000000, 0.000000000000000, 0.000000000000000,
77 0.000000000000000, 0.000000000000000, 0.000000000000000,
78 0.004729457992255, 0.003244936115630, -2.049925698035195,
79 -0.004426326532074, -0.000555564565248, 1.666576780407488,
80 0.000000000000000, 0.000000000000000, 0.000000000000000,
81 0.000000000000000, 0.000000000000000, 0.000000000000000,
82 -0.004426326532074, -0.000555564565248, 1.666576780407488};
85 std::isnan(C(0, 0)) || !std::isfinite(C(0, 0)) ||
86 (AInv - C).array().abs().
sum() > 1e-4,
87 "Error in inv, 6x6 fix")
90 TEST(Matrices, inv_6x6_dyn)
92 const double dat_A[] = {
93 363.769989013671875, 0.000000000000000, 316.429992675781250,
94 0.000000000000000, 87.266998291015625, 0.000000000000000,
95 101.540000915527344, 0.000000000000000, 478.709991455078125,
96 0.000000000000000, 504.540008544921875, 0.000000000000000,
97 1.000000000000000, 0.000000000000000, 1.000000000000000,
98 0.000000000000000, 1.000000000000000, 0.000000000000000,
99 0.000000000000000, 363.769989013671875, 0.000000000000000,
100 316.429992675781250, 0.000000000000000, 87.266998291015625,
101 0.000000000000000, 101.540000915527344, 0.000000000000000,
102 478.709991455078125, 0.000000000000000, 504.540008544921875,
103 0.000000000000000, 1.000000000000000, 0.000000000000000,
104 1.000000000000000, 0.000000000000000, 1.000000000000000};
107 const double dat_AInv[] = {
108 -0.000303131460181, -0.002689371550382, 1.383348917627708,
109 0.000000000000000, 0.000000000000000, 0.000000000000000,
110 0.000000000000000, 0.000000000000000, 0.000000000000000,
111 -0.000303131460181, -0.002689371550382, 1.383348917627708,
112 0.004729457992255, 0.003244936115630, -2.049925698035195,
113 0.000000000000000, 0.000000000000000, 0.000000000000000,
114 0.000000000000000, 0.000000000000000, 0.000000000000000,
115 0.004729457992255, 0.003244936115630, -2.049925698035195,
116 -0.004426326532074, -0.000555564565248, 1.666576780407488,
117 0.000000000000000, 0.000000000000000, 0.000000000000000,
118 0.000000000000000, 0.000000000000000, 0.000000000000000,
119 -0.004426326532074, -0.000555564565248, 1.666576780407488};
122 std::isnan(C(0, 0)) || !std::isfinite(C(0, 0)) ||
123 (AInv - C).array().abs().
sum() > 1e-4,
124 "Error in inv, 6x6 dyn")
129 const double dat_A[] = {1, 2, 3, 4, 5, 6};
130 const double dat_At[] = {1, 4, 2, 5, 3, 6};
134 EXPECT_EQ(A.t(), At);
136 EXPECT_EQ(A.t().t(), A);
142 const double dat_A[] = {1, 2, 3, 4, 5, 6};
144 const std::vector<double>
v{1.0, 2.0, 3.0};
148 R.multiply_A_skew3(A,
v);
149 EXPECT_EQ(
R, (A * S).eval());
152 const double dat_A[] = {1, 2, 3, 4, 5, 6};
153 const double dat_v[] = {1, 2, 3};
160 R.multiply_A_skew3(A,
v);
161 EXPECT_TRUE(
R == A * S);
168 const double dat_A[] = {1, 2, 3, 4, 5, 6};
170 const std::vector<double>
v{1.0, 2.0, 3.0};
174 R.multiply_skew3_A(
v, A);
175 EXPECT_TRUE(
R == S * A);
178 const double dat_A[] = {1, 2, 3, 4, 5, 6};
179 const double dat_v[] = {1, 2, 3};
186 R.multiply_skew3_A(
v, A);
187 EXPECT_TRUE(
R == S * A);
193 const char* mat1 =
"[1 2 3;-3 -6 -5]";
194 const double vals1[] = {1, 2, 3, -3, -6, -5};
197 " [ -8.2 9.232 ; -2e+2 +6 ; 1.000 7 ] ";
199 const double vals2[] = {-8.2, 9.232, -2e+2, +6, 1.000, 7};
201 const char* mat3 =
"[9]";
203 "[1 2 3 4 5 6 7 9 10 ; 1 2 3 4 5 6 7 8 9 10 11]";
204 const char* mat5 =
"[ ]";
205 const char* mat6 =
"[ -405.200 42.232 ; 1219.600 -98.696 ]";
207 const char* mat13 =
"[9 8 7]";
208 const char* mat31 =
"[9; 8; 7]";
212 if (!M1.fromMatlabStringFormat(mat1) ||
215 GTEST_FAIL() << mat1;
219 if (!M1b.fromMatlabStringFormat(mat1) ||
224 GTEST_FAIL() << mat1;
227 if (!M2.fromMatlabStringFormat(mat2) || M2.cols() != 2 || M2.rows() != 3 ||
230 GTEST_FAIL() << mat2;
234 if (!M2b.fromMatlabStringFormat(mat2) ||
239 GTEST_FAIL() << mat2;
242 if (!M3.fromMatlabStringFormat(mat3)) GTEST_FAIL() << mat3;
246 if (!m.fromMatlabStringFormat(mat3) || m.size() != 1)
247 GTEST_FAIL() <<
"CVectorDouble:" << mat3;
251 if (!m.fromMatlabStringFormat(mat3))
252 GTEST_FAIL() <<
"CArrayDouble<1>:" << mat3;
257 if (!m.fromMatlabStringFormat(mat31) || m.size() != 3)
258 GTEST_FAIL() <<
"CVectorDouble:" << mat31;
262 if (!m.fromMatlabStringFormat(mat31))
263 GTEST_FAIL() <<
"CArrayDouble<3>:" << mat31;
267 Eigen::Matrix<double, 1, 3> m;
268 if (!m.fromMatlabStringFormat(mat13))
269 GTEST_FAIL() <<
"Matrix<double,1,3>:" << mat13;
272 Eigen::Matrix<double, 1, Eigen::Dynamic> m;
273 if (!m.fromMatlabStringFormat(mat13) || m.size() != 3)
274 GTEST_FAIL() <<
"Matrix<double,1,Dynamic>:" << mat13;
278 if (M4.fromMatlabStringFormat(mat4,
nullptr ))
279 GTEST_FAIL() << mat4;
281 if (!M5.fromMatlabStringFormat(mat5) || M5.rows() != 0 || M5.cols() != 0)
282 GTEST_FAIL() << mat5;
284 if (!M6.fromMatlabStringFormat(mat6)) GTEST_FAIL() << mat6;
289 EXPECT_NEAR(0, (M6 - M1 * M2).array().
square().
sum(), 1e-3);
A namespace of pseudo-random numbers generators of diferent distributions.
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_A_skew3(const MAT_A &A, const SKEW_3VECTOR &v, MAT_OUT &out)
Only for vectors/arrays "v" of length3, compute out = A * Skew(v), where Skew(v) is the skew symmetri...
CArrayNumeric is an array for numeric types supporting several mathematical operations (actually...
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.
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 fromMatlabStringFormat(const std::string &s, std::ostream *dump_errors_here=nullptr)
Read a matrix from a string in Matlab-like format, for example "[1 0 2; 0 4 -1]" The string must star...
GLsizei GLboolean transpose
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define CHECK_AND_RET_ERROR(_COND_, _MSG_)
void multiply_skew3_A(const SKEW_3VECTOR &v, const MAT_A &A, MAT_OUT &out)
Only for vectors/arrays "v" of length3, compute out = Skew(v) * A, where Skew(v) is the skew symmetri...