diff --git a/Tools/fix_code_style_ubuntu.sh b/Tools/fix_code_style_ubuntu.sh new file mode 100755 index 0000000000..90ab57b895 --- /dev/null +++ b/Tools/fix_code_style_ubuntu.sh @@ -0,0 +1,19 @@ +#!/bin/sh +astyle \ + --style=linux \ + --indent=force-tab=8 \ + --indent-cases \ + --indent-preprocessor \ + --break-blocks=all \ + --pad-oper \ + --pad-header \ + --unpad-paren \ + --keep-one-line-blocks \ + --keep-one-line-statements \ + --align-pointer=name \ + --suffix=none \ + --lineend=linux \ + $* + #--ignore-exclude-errors-x \ + #--exclude=EASTL \ + #--align-reference=name \ diff --git a/apps/systemlib/math/Dcm.cpp b/apps/systemlib/math/Dcm.cpp index 1e9c4ee6d0..b9f4309cc1 100644 --- a/apps/systemlib/math/Dcm.cpp +++ b/apps/systemlib/math/Dcm.cpp @@ -48,64 +48,64 @@ namespace math { Dcm::Dcm() : - Matrix(Matrix::identity(3)) + Matrix(Matrix::identity(3)) { } -Dcm::Dcm(const float * data) : - Matrix(3,3,data) +Dcm::Dcm(const float *data) : + Matrix(3, 3, data) { } -Dcm::Dcm(const Quaternion & q) : - Matrix(3,3) +Dcm::Dcm(const Quaternion &q) : + Matrix(3, 3) { - Dcm & dcm = *this; - float a = q.getA(); - float b = q.getB(); - float c = q.getC(); - float d = q.getD(); - float aSq = a*a; - float bSq = b*b; - float cSq = c*c; - float dSq = d*d; - dcm(0,0) = aSq + bSq - cSq - dSq; - dcm(0,1) = 2*(b*c - a*d); - dcm(0,2) = 2*(a*c + b*d); - dcm(1,0) = 2*(b*c + a*d); - dcm(1,1) = aSq - bSq + cSq - dSq; - dcm(1,2) = 2*(c*d - a*b); - dcm(2,0) = 2*(b*d - a*c); - dcm(2,1) = 2*(a*b + c*d); - dcm(2,2) = aSq - bSq - cSq + dSq; + Dcm &dcm = *this; + float a = q.getA(); + float b = q.getB(); + float c = q.getC(); + float d = q.getD(); + float aSq = a * a; + float bSq = b * b; + float cSq = c * c; + float dSq = d * d; + dcm(0, 0) = aSq + bSq - cSq - dSq; + dcm(0, 1) = 2 * (b * c - a * d); + dcm(0, 2) = 2 * (a * c + b * d); + dcm(1, 0) = 2 * (b * c + a * d); + dcm(1, 1) = aSq - bSq + cSq - dSq; + dcm(1, 2) = 2 * (c * d - a * b); + dcm(2, 0) = 2 * (b * d - a * c); + dcm(2, 1) = 2 * (a * b + c * d); + dcm(2, 2) = aSq - bSq - cSq + dSq; } -Dcm::Dcm(const EulerAngles & euler) : - Matrix(3,3) +Dcm::Dcm(const EulerAngles &euler) : + Matrix(3, 3) { - Dcm & dcm = *this; - float cosPhi = cosf(euler.getPhi()); - float sinPhi = sinf(euler.getPhi()); - float cosThe = cosf(euler.getTheta()); - float sinThe = sinf(euler.getTheta()); - float cosPsi = cosf(euler.getPsi()); - float sinPsi = sinf(euler.getPsi()); + Dcm &dcm = *this; + float cosPhi = cosf(euler.getPhi()); + float sinPhi = sinf(euler.getPhi()); + float cosThe = cosf(euler.getTheta()); + float sinThe = sinf(euler.getTheta()); + float cosPsi = cosf(euler.getPsi()); + float sinPsi = sinf(euler.getPsi()); - dcm(0,0) = cosThe*cosPsi; - dcm(0,1) = -cosPhi*sinPsi + sinPhi*sinThe*cosPsi; - dcm(0,2) = sinPhi*sinPsi + cosPhi*sinThe*cosPsi; + dcm(0, 0) = cosThe * cosPsi; + dcm(0, 1) = -cosPhi * sinPsi + sinPhi * sinThe * cosPsi; + dcm(0, 2) = sinPhi * sinPsi + cosPhi * sinThe * cosPsi; - dcm(1,0) = cosThe*sinPsi; - dcm(1,1) = cosPhi*cosPsi + sinPhi*sinThe*sinPsi; - dcm(1,2) = -sinPhi*cosPsi + cosPhi*sinThe*sinPsi; + dcm(1, 0) = cosThe * sinPsi; + dcm(1, 1) = cosPhi * cosPsi + sinPhi * sinThe * sinPsi; + dcm(1, 2) = -sinPhi * cosPsi + cosPhi * sinThe * sinPsi; - dcm(2,0) = -sinThe; - dcm(2,1) = sinPhi*cosThe; - dcm(2,2) = cosPhi*cosThe; + dcm(2, 0) = -sinThe; + dcm(2, 1) = sinPhi * cosThe; + dcm(2, 2) = cosPhi * cosThe; } -Dcm::Dcm(const Dcm & right) : - Matrix(right) +Dcm::Dcm(const Dcm &right) : + Matrix(right) { } @@ -115,22 +115,22 @@ Dcm::~Dcm() int __EXPORT dcmTest() { - printf("Test DCM\t\t: "); - Vector3 vB(1,2,3); - ASSERT(matrixEqual(Dcm(Quaternion(1,0,0,0)), - Matrix::identity(3))); - ASSERT(matrixEqual(Dcm(EulerAngles(0,0,0)), - Matrix::identity(3))); - ASSERT(vectorEqual(Vector3(-2,1,3), - Dcm(EulerAngles(0,0,M_PI_2_F))*vB)); - ASSERT(vectorEqual(Vector3(3,2,-1), - Dcm(EulerAngles(0,M_PI_2_F,0))*vB)); - ASSERT(vectorEqual(Vector3(1,-3,2), - Dcm(EulerAngles(M_PI_2_F,0,0))*vB)); - ASSERT(vectorEqual(Vector3(3,2,-1), - Dcm(EulerAngles( - M_PI_2_F,M_PI_2_F,M_PI_2_F))*vB)); - printf("PASS\n"); - return 0; + printf("Test DCM\t\t: "); + Vector3 vB(1, 2, 3); + ASSERT(matrixEqual(Dcm(Quaternion(1, 0, 0, 0)), + Matrix::identity(3))); + ASSERT(matrixEqual(Dcm(EulerAngles(0, 0, 0)), + Matrix::identity(3))); + ASSERT(vectorEqual(Vector3(-2, 1, 3), + Dcm(EulerAngles(0, 0, M_PI_2_F))*vB)); + ASSERT(vectorEqual(Vector3(3, 2, -1), + Dcm(EulerAngles(0, M_PI_2_F, 0))*vB)); + ASSERT(vectorEqual(Vector3(1, -3, 2), + Dcm(EulerAngles(M_PI_2_F, 0, 0))*vB)); + ASSERT(vectorEqual(Vector3(3, 2, -1), + Dcm(EulerAngles( + M_PI_2_F, M_PI_2_F, M_PI_2_F))*vB)); + printf("PASS\n"); + return 0; } } // namespace math diff --git a/apps/systemlib/math/Dcm.hpp b/apps/systemlib/math/Dcm.hpp index 658d902faa..de69a7aa4d 100644 --- a/apps/systemlib/math/Dcm.hpp +++ b/apps/systemlib/math/Dcm.hpp @@ -42,7 +42,8 @@ #include "Vector.hpp" #include "Matrix.hpp" -namespace math { +namespace math +{ class Quaternion; class EulerAngles; @@ -52,41 +53,41 @@ class EulerAngles; * (yaw)-(pitch)-(roll) * The Dcm transforms a vector in the body frame * to the navigation frame, typically represented - * as C_nb. C_bn can be obtained through use + * as C_nb. C_bn can be obtained through use * of the transpose() method. */ class __EXPORT Dcm : public Matrix { public: - /** - * default ctor - */ - Dcm(); + /** + * default ctor + */ + Dcm(); - /** - * data ctor - */ - Dcm(const float * data); + /** + * data ctor + */ + Dcm(const float *data); - /** - * quaternion ctor - */ - Dcm(const Quaternion & q); + /** + * quaternion ctor + */ + Dcm(const Quaternion &q); - /** - * euler angles ctor - */ - Dcm(const EulerAngles & euler); + /** + * euler angles ctor + */ + Dcm(const EulerAngles &euler); - /** - * copy ctor (deep) - */ - Dcm(const Dcm & right); + /** + * copy ctor (deep) + */ + Dcm(const Dcm &right); - /** - * dtor - */ - virtual ~Dcm(); + /** + * dtor + */ + virtual ~Dcm(); }; int __EXPORT dcmTest(); diff --git a/apps/systemlib/math/EulerAngles.cpp b/apps/systemlib/math/EulerAngles.cpp index b530f172d8..259c866c73 100644 --- a/apps/systemlib/math/EulerAngles.cpp +++ b/apps/systemlib/math/EulerAngles.cpp @@ -48,48 +48,46 @@ namespace math { EulerAngles::EulerAngles() : - Vector(3) + Vector(3) { - setPhi(0.0f); - setTheta(0.0f); - setPsi(0.0f); + setPhi(0.0f); + setTheta(0.0f); + setPsi(0.0f); } EulerAngles::EulerAngles(float phi, float theta, float psi) : - Vector(3) + Vector(3) { - setPhi(phi); - setTheta(theta); - setPsi(psi); + setPhi(phi); + setTheta(theta); + setPsi(psi); } -EulerAngles::EulerAngles(const Quaternion & q) : - Vector(3) +EulerAngles::EulerAngles(const Quaternion &q) : + Vector(3) { - (*this) = EulerAngles(Dcm(q)); + (*this) = EulerAngles(Dcm(q)); } -EulerAngles::EulerAngles(const Dcm & dcm) : - Vector(3) +EulerAngles::EulerAngles(const Dcm &dcm) : + Vector(3) { - setTheta(asinf(-dcm(2,0))); - if (fabsf(getTheta() - M_PI_2_F) < 1.0e-3f) - { - setPhi(0.0f); - setPsi(atan2f(dcm(1,2) - dcm(0,1), - dcm(0,2) + dcm(1,1)) + getPhi()); - } - else if (fabsf(getTheta() + M_PI_2_F) < 1.0e-3f) - { - setPhi(0.0f); - setPsi(atan2f(dcm(1,2) - dcm(0,1), - dcm(0,2) + dcm(1,1)) - getPhi()); - } - else - { - setPhi(atan2f(dcm(2,1),dcm(2,2))); - setPsi(atan2f(dcm(1,0),dcm(0,0))); - } + setTheta(asinf(-dcm(2, 0))); + + if (fabsf(getTheta() - M_PI_2_F) < 1.0e-3f) { + setPhi(0.0f); + setPsi(atan2f(dcm(1, 2) - dcm(0, 1), + dcm(0, 2) + dcm(1, 1)) + getPhi()); + + } else if (fabsf(getTheta() + M_PI_2_F) < 1.0e-3f) { + setPhi(0.0f); + setPsi(atan2f(dcm(1, 2) - dcm(0, 1), + dcm(0, 2) + dcm(1, 1)) - getPhi()); + + } else { + setPhi(atan2f(dcm(2, 1), dcm(2, 2))); + setPsi(atan2f(dcm(1, 0), dcm(0, 0))); + } } EulerAngles::~EulerAngles() @@ -98,27 +96,27 @@ EulerAngles::~EulerAngles() int __EXPORT eulerAnglesTest() { - printf("Test EulerAngles\t: "); - EulerAngles euler(1,2,3); + printf("Test EulerAngles\t: "); + EulerAngles euler(1, 2, 3); - // test ctor - ASSERT(vectorEqual(Vector3(1,2,3),euler)); - ASSERT(equal(euler.getPhi(),1)); - ASSERT(equal(euler.getTheta(),2)); - ASSERT(equal(euler.getPsi(),3)); + // test ctor + ASSERT(vectorEqual(Vector3(1, 2, 3), euler)); + ASSERT(equal(euler.getPhi(), 1)); + ASSERT(equal(euler.getTheta(), 2)); + ASSERT(equal(euler.getPsi(), 3)); - // test dcm ctor + // test dcm ctor - // test assignment - euler.setPhi(4); - ASSERT(equal(euler.getPhi(),4)); - euler.setTheta(5); - ASSERT(equal(euler.getTheta(),5)); - euler.setPsi(6); - ASSERT(equal(euler.getPsi(),6)); - - printf("PASS\n"); - return 0; + // test assignment + euler.setPhi(4); + ASSERT(equal(euler.getPhi(), 4)); + euler.setTheta(5); + ASSERT(equal(euler.getTheta(), 5)); + euler.setPsi(6); + ASSERT(equal(euler.getPsi(), 6)); + + printf("PASS\n"); + return 0; } } // namespace math diff --git a/apps/systemlib/math/EulerAngles.hpp b/apps/systemlib/math/EulerAngles.hpp index 59e5500ad0..399eecfa7d 100644 --- a/apps/systemlib/math/EulerAngles.hpp +++ b/apps/systemlib/math/EulerAngles.hpp @@ -41,7 +41,8 @@ #include "Vector.hpp" -namespace math { +namespace math +{ class Quaternion; class Dcm; @@ -49,21 +50,21 @@ class Dcm; class __EXPORT EulerAngles : public Vector { public: - EulerAngles(); - EulerAngles(float phi, float theta, float psi); - EulerAngles(const Quaternion & q); - EulerAngles(const Dcm & dcm); - virtual ~EulerAngles(); + EulerAngles(); + EulerAngles(float phi, float theta, float psi); + EulerAngles(const Quaternion &q); + EulerAngles(const Dcm &dcm); + virtual ~EulerAngles(); - // alias - void setPhi(float phi) { (*this)(0) = phi; } - void setTheta(float theta) { (*this)(1) = theta; } - void setPsi(float psi) { (*this)(2) = psi; } + // alias + void setPhi(float phi) { (*this)(0) = phi; } + void setTheta(float theta) { (*this)(1) = theta; } + void setPsi(float psi) { (*this)(2) = psi; } - // const accessors - const float & getPhi() const { return (*this)(0); } - const float & getTheta() const { return (*this)(1); } - const float & getPsi() const { return (*this)(2); } + // const accessors + const float &getPhi() const { return (*this)(0); } + const float &getTheta() const { return (*this)(1); } + const float &getPsi() const { return (*this)(2); } }; diff --git a/apps/systemlib/math/Matrix.cpp b/apps/systemlib/math/Matrix.cpp index 08796da89b..5e536c3a8d 100644 --- a/apps/systemlib/math/Matrix.cpp +++ b/apps/systemlib/math/Matrix.cpp @@ -45,136 +45,149 @@ namespace math { -static const float data_testA[] = - {1,2,3, - 4,5,6}; -static Matrix testA(2,3,data_testA); +static const float data_testA[] = { + 1, 2, 3, + 4, 5, 6 +}; +static Matrix testA(2, 3, data_testA); -static const float data_testB[] = - {0,1,3, - 7,-1,2}; -static Matrix testB(2,3,data_testB); +static const float data_testB[] = { + 0, 1, 3, + 7, -1, 2 +}; +static Matrix testB(2, 3, data_testB); -static const float data_testC[] = - {0,1, - 2,1, - 3,2}; -static Matrix testC(3,2,data_testC); +static const float data_testC[] = { + 0, 1, + 2, 1, + 3, 2 +}; +static Matrix testC(3, 2, data_testC); -static const float data_testD[] = - {0,1,2, - 2,1,4, - 5,2,0}; -static Matrix testD(3,3,data_testD); +static const float data_testD[] = { + 0, 1, 2, + 2, 1, 4, + 5, 2, 0 +}; +static Matrix testD(3, 3, data_testD); -static const float data_testE[] = - {1,-1,2, - 0,2,3, - 2,-1,1}; -static Matrix testE(3,3,data_testE); +static const float data_testE[] = { + 1, -1, 2, + 0, 2, 3, + 2, -1, 1 +}; +static Matrix testE(3, 3, data_testE); -static const float data_testF[] = - {3.777e006f, 2.915e007f, 0.000e000f, - 2.938e007f, 2.267e008f, 0.000e000f, - 0.000e000f, 0.000e000f, 6.033e008f}; -static Matrix testF(3,3,data_testF); +static const float data_testF[] = { + 3.777e006f, 2.915e007f, 0.000e000f, + 2.938e007f, 2.267e008f, 0.000e000f, + 0.000e000f, 0.000e000f, 6.033e008f +}; +static Matrix testF(3, 3, data_testF); int __EXPORT matrixTest() { - matrixAddTest(); - matrixSubTest(); - matrixMultTest(); - matrixInvTest(); - matrixDivTest(); - return 0; + matrixAddTest(); + matrixSubTest(); + matrixMultTest(); + matrixInvTest(); + matrixDivTest(); + return 0; } int matrixAddTest() { - printf("Test Matrix Add\t\t: "); - Matrix r = testA + testB; - float data_test[] = - { 1.0f, 3.0f, 6.0f, - 11.0f, 4.0f, 8.0f}; - ASSERT(matrixEqual(Matrix(2,3,data_test),r)); - printf("PASS\n"); - return 0; + printf("Test Matrix Add\t\t: "); + Matrix r = testA + testB; + float data_test[] = { + 1.0f, 3.0f, 6.0f, + 11.0f, 4.0f, 8.0f + }; + ASSERT(matrixEqual(Matrix(2, 3, data_test), r)); + printf("PASS\n"); + return 0; } int matrixSubTest() { - printf("Test Matrix Sub\t\t: "); - Matrix r = testA - testB; - float data_test[] = - { 1.0f, 1.0f, 0.0f, - -3.0f, 6.0f, 4.0f}; - ASSERT(matrixEqual(Matrix(2,3,data_test),r)); - printf("PASS\n"); - return 0; + printf("Test Matrix Sub\t\t: "); + Matrix r = testA - testB; + float data_test[] = { + 1.0f, 1.0f, 0.0f, + -3.0f, 6.0f, 4.0f + }; + ASSERT(matrixEqual(Matrix(2, 3, data_test), r)); + printf("PASS\n"); + return 0; } int matrixMultTest() { - printf("Test Matrix Mult\t: "); - Matrix r = testC * testB; - float data_test[] = - { 7.0f, -1.0f, 2.0f, - 7.0f, 1.0f, 8.0f, - 14.0f, 1.0f, 13.0f}; - ASSERT(matrixEqual(Matrix(3,3,data_test),r)); - printf("PASS\n"); - return 0; + printf("Test Matrix Mult\t: "); + Matrix r = testC * testB; + float data_test[] = { + 7.0f, -1.0f, 2.0f, + 7.0f, 1.0f, 8.0f, + 14.0f, 1.0f, 13.0f + }; + ASSERT(matrixEqual(Matrix(3, 3, data_test), r)); + printf("PASS\n"); + return 0; } int matrixInvTest() { - printf("Test Matrix Inv\t\t: "); - Matrix origF = testF; - Matrix r = testF.inverse(); - float data_test[] = - { -0.0012518f, 0.0001610f, 0.0000000f, - 0.0001622f, -0.0000209f, 0.0000000f, - 0.0000000f, 0.0000000f, 1.6580e-9f}; - ASSERT(matrixEqual(Matrix(3,3,data_test),r)); - // make sure F in unchanged - ASSERT(matrixEqual(origF,testF)); - printf("PASS\n"); - return 0; + printf("Test Matrix Inv\t\t: "); + Matrix origF = testF; + Matrix r = testF.inverse(); + float data_test[] = { + -0.0012518f, 0.0001610f, 0.0000000f, + 0.0001622f, -0.0000209f, 0.0000000f, + 0.0000000f, 0.0000000f, 1.6580e-9f + }; + ASSERT(matrixEqual(Matrix(3, 3, data_test), r)); + // make sure F in unchanged + ASSERT(matrixEqual(origF, testF)); + printf("PASS\n"); + return 0; } int matrixDivTest() { - printf("Test Matrix Div\t\t: "); - Matrix r = testD / testE; - float data_test[] = { - 0.2222222f, 0.5555556f, -0.1111111f, - 0.0f, 1.0f, 1.0, - -4.1111111f, 1.2222222f, 4.5555556f}; - ASSERT(matrixEqual(Matrix(3,3,data_test),r)); - printf("PASS\n"); - return 0; + printf("Test Matrix Div\t\t: "); + Matrix r = testD / testE; + float data_test[] = { + 0.2222222f, 0.5555556f, -0.1111111f, + 0.0f, 1.0f, 1.0, + -4.1111111f, 1.2222222f, 4.5555556f + }; + ASSERT(matrixEqual(Matrix(3, 3, data_test), r)); + printf("PASS\n"); + return 0; } -bool matrixEqual(const Matrix & a, const Matrix & b, float eps) +bool matrixEqual(const Matrix &a, const Matrix &b, float eps) { - if (a.getRows() != b.getRows()) { - printf("row number not equal a: %d, b:%d\n", a.getRows(), b.getRows()); - return false; - } else if (a.getCols() != b.getCols()) { - printf("column number not equal a: %d, b:%d\n", a.getCols(), b.getCols()); - return false; - } - bool ret = true; - for (size_t i=0;i 1e-30f) - return false; - } - } - return true; - } - // scalar ops - inline Matrix operator+(float right) const - { - Matrix result(getRows(), getCols()); - arm_offset_f32((float *)getData(),right, - (float *)result.getData(),getRows()*getCols()); - return result; - } - inline Matrix operator-(float right) const - { - Matrix result(getRows(), getCols()); - arm_offset_f32((float *)getData(),-right, - (float *)result.getData(),getRows()*getCols()); - return result; - } - inline Matrix operator*(float right) const - { - Matrix result(getRows(), getCols()); - arm_mat_scale_f32(&_matrix,right, - &(result._matrix)); - return result; - } - inline Matrix operator/(float right) const - { - Matrix result(getRows(), getCols()); - arm_mat_scale_f32(&_matrix,1.0f/right, - &(result._matrix)); - return result; - } - // vector ops - inline Vector operator*(const Vector & right) const - { + return getData()[i * getCols() + j]; + } + // output + inline void print() const { + for (size_t i = 0; i < getRows(); i++) { + for (size_t j = 0; j < getCols(); j++) { + float sig; + int exp; + float num = (*this)(i, j); + float2SigExp(num, sig, exp); + printf("%6.3fe%03.3d,", (double)sig, exp); + } + + printf("\n"); + } + } + // boolean ops + inline bool operator==(const Matrix &right) const { + for (size_t i = 0; i < getRows(); i++) { + for (size_t j = 0; j < getCols(); j++) { + if (fabsf((*this)(i, j) - right(i, j)) > 1e-30f) + return false; + } + } + + return true; + } + // scalar ops + inline Matrix operator+(float right) const { + Matrix result(getRows(), getCols()); + arm_offset_f32((float *)getData(), right, + (float *)result.getData(), getRows()*getCols()); + return result; + } + inline Matrix operator-(float right) const { + Matrix result(getRows(), getCols()); + arm_offset_f32((float *)getData(), -right, + (float *)result.getData(), getRows()*getCols()); + return result; + } + inline Matrix operator*(float right) const { + Matrix result(getRows(), getCols()); + arm_mat_scale_f32(&_matrix, right, + &(result._matrix)); + return result; + } + inline Matrix operator/(float right) const { + Matrix result(getRows(), getCols()); + arm_mat_scale_f32(&_matrix, 1.0f / right, + &(result._matrix)); + return result; + } + // vector ops + inline Vector operator*(const Vector &right) const { #ifdef MATRIX_ASSERT - ASSERT(getCols()==right.getRows()); + ASSERT(getCols() == right.getRows()); #endif - Matrix resultMat = (*this)* - Matrix(right.getRows(),1,right.getData()); - return Vector(getRows(),resultMat.getData()); - } - // matrix ops - inline Matrix operator+(const Matrix & right) const - { + Matrix resultMat = (*this) * + Matrix(right.getRows(), 1, right.getData()); + return Vector(getRows(), resultMat.getData()); + } + // matrix ops + inline Matrix operator+(const Matrix &right) const { #ifdef MATRIX_ASSERT - ASSERT(getRows()==right.getRows()); - ASSERT(getCols()==right.getCols()); + ASSERT(getRows() == right.getRows()); + ASSERT(getCols() == right.getCols()); #endif - Matrix result(getRows(), getCols()); - arm_mat_add_f32(&_matrix, &(right._matrix), - &(result._matrix)); - return result; - } - inline Matrix operator-(const Matrix & right) const - { + Matrix result(getRows(), getCols()); + arm_mat_add_f32(&_matrix, &(right._matrix), + &(result._matrix)); + return result; + } + inline Matrix operator-(const Matrix &right) const { #ifdef MATRIX_ASSERT - ASSERT(getRows()==right.getRows()); - ASSERT(getCols()==right.getCols()); + ASSERT(getRows() == right.getRows()); + ASSERT(getCols() == right.getCols()); #endif - Matrix result(getRows(), getCols()); - arm_mat_sub_f32(&_matrix, &(right._matrix), - &(result._matrix)); - return result; - } - inline Matrix operator*(const Matrix & right) const - { + Matrix result(getRows(), getCols()); + arm_mat_sub_f32(&_matrix, &(right._matrix), + &(result._matrix)); + return result; + } + inline Matrix operator*(const Matrix &right) const { #ifdef MATRIX_ASSERT - ASSERT(getCols()==right.getRows()); + ASSERT(getCols() == right.getRows()); #endif - Matrix result(getRows(), right.getCols()); - arm_mat_mult_f32(&_matrix, &(right._matrix), - &(result._matrix)); - return result; - } - inline Matrix operator/(const Matrix & right) const - { + Matrix result(getRows(), right.getCols()); + arm_mat_mult_f32(&_matrix, &(right._matrix), + &(result._matrix)); + return result; + } + inline Matrix operator/(const Matrix &right) const { #ifdef MATRIX_ASSERT - ASSERT(right.getRows()==right.getCols()); - ASSERT(getCols()==right.getCols()); + ASSERT(right.getRows() == right.getCols()); + ASSERT(getCols() == right.getCols()); #endif - return (*this)*right.inverse(); - } - // other functions - inline Matrix transpose() const - { - Matrix result(getCols(),getRows()); - arm_mat_trans_f32(&_matrix, &(result._matrix)); - return result; - } - inline void swapRows(size_t a, size_t b) - { - if (a==b) return; - for(size_t j=0;j 1e-30f) - return false; - } - return true; - } - // scalar ops - inline Vector operator+(float right) const - { - Vector result(getRows()); - arm_offset_f32((float*)getData(), - right, result.getData(), - getRows()); - return result; - } - inline Vector operator-(float right) const - { - Vector result(getRows()); - arm_offset_f32((float*)getData(), - -right, result.getData(), - getRows()); - return result; - } - inline Vector operator*(float right) const - { - Vector result(getRows()); - arm_scale_f32((float*)getData(), - right, result.getData(), - getRows()); - return result; - } - inline Vector operator/(float right) const - { - Vector result(getRows()); - arm_scale_f32((float*)getData(), - 1.0f/right, result.getData(), - getRows()); - return result; - } - // vector ops - inline Vector operator+(const Vector & right) const - { + return getData()[i]; + } + // output + inline void print() const { + for (size_t i = 0; i < getRows(); i++) { + float sig; + int exp; + float num = (*this)(i); + float2SigExp(num, sig, exp); + printf("%6.3fe%03.3d,", (double)sig, exp); + } + + printf("\n"); + } + // boolean ops + inline bool operator==(const Vector &right) const { + for (size_t i = 0; i < getRows(); i++) { + if (fabsf(((*this)(i) - right(i))) > 1e-30f) + return false; + } + + return true; + } + // scalar ops + inline Vector operator+(float right) const { + Vector result(getRows()); + arm_offset_f32((float *)getData(), + right, result.getData(), + getRows()); + return result; + } + inline Vector operator-(float right) const { + Vector result(getRows()); + arm_offset_f32((float *)getData(), + -right, result.getData(), + getRows()); + return result; + } + inline Vector operator*(float right) const { + Vector result(getRows()); + arm_scale_f32((float *)getData(), + right, result.getData(), + getRows()); + return result; + } + inline Vector operator/(float right) const { + Vector result(getRows()); + arm_scale_f32((float *)getData(), + 1.0f / right, result.getData(), + getRows()); + return result; + } + // vector ops + inline Vector operator+(const Vector &right) const { #ifdef VECTOR_ASSERT - ASSERT(getRows()==right.getRows()); + ASSERT(getRows() == right.getRows()); #endif - Vector result(getRows()); - arm_add_f32((float*)getData(), - (float*)right.getData(), - result.getData(), - getRows()); - return result; - } - inline Vector operator-(const Vector & right) const - { + Vector result(getRows()); + arm_add_f32((float *)getData(), + (float *)right.getData(), + result.getData(), + getRows()); + return result; + } + inline Vector operator-(const Vector &right) const { #ifdef VECTOR_ASSERT - ASSERT(getRows()==right.getRows()); + ASSERT(getRows() == right.getRows()); #endif - Vector result(getRows()); - arm_sub_f32((float*)getData(), - (float*)right.getData(), - result.getData(), - getRows()); - return result; - } - // other functions - inline float dot(const Vector & right) - { - float result = 0; - arm_dot_prod_f32((float*)getData(), - (float*)right.getData(), - getRows(), - &result); - return result; - } - inline float norm() - { - return sqrtf(dot(*this)); - } - inline Vector unit() - { - return (*this)/norm(); - } - inline static Vector zero(size_t rows) - { - Vector result(rows); - // calloc returns zeroed memory - return result; - } - inline void setAll(const float & val) - { - for (size_t i=0;i 1e-30f) - return false; - } - } - return true; - } - // scalar ops - inline Matrix operator+(const float & right) const - { - Matrix result(getRows(), getCols()); - for (size_t i=0; i1e-8f) { - //printf("swapped %d\n",i); - U.swapRows(i,n); - P.swapRows(i,n); - } - } - } + return *this; + } + // element accessors + inline float &operator()(size_t i, size_t j) { #ifdef MATRIX_ASSERT - //printf("A:\n"); A.print(); - //printf("U:\n"); U.print(); - //printf("P:\n"); P.print(); - //fflush(stdout); - ASSERT(fabsf(U(n,n))>1e-8f); + ASSERT(i < getRows()); + ASSERT(j < getCols()); #endif - // failsafe, return zero matrix - if (fabsf(U(n,n))<1e-8f) - { - return Matrix::zero(n); - } + return getData()[i * getCols() + j]; + } + inline const float &operator()(size_t i, size_t j) const { +#ifdef MATRIX_ASSERT + ASSERT(i < getRows()); + ASSERT(j < getCols()); +#endif + return getData()[i * getCols() + j]; + } + // output + inline void print() const { + for (size_t i = 0; i < getRows(); i++) { + for (size_t j = 0; j < getCols(); j++) { + float sig; + int exp; + float num = (*this)(i, j); + float2SigExp(num, sig, exp); + printf("%6.3fe%03.3d,", (double)sig, exp); + } - // for all rows below diagonal - for (size_t i=(n+1); i 1e-30f) + return false; + } + } - //printf("L:\n"); L.print(); - //printf("U:\n"); U.print(); + return true; + } + // scalar ops + inline Matrix operator+(const float &right) const { + Matrix result(getRows(), getCols()); - // solve LY=P*I for Y by forward subst - Matrix Y = P; - // for all columns of Y - for (size_t c=0; c 1e-8f) { + //printf("swapped %d\n",i); + U.swapRows(i, n); + P.swapRows(i, n); + } + } + } + +#ifdef MATRIX_ASSERT + //printf("A:\n"); A.print(); + //printf("U:\n"); U.print(); + //printf("P:\n"); P.print(); + //fflush(stdout); + ASSERT(fabsf(U(n, n)) > 1e-8f); +#endif + + // failsafe, return zero matrix + if (fabsf(U(n, n)) < 1e-8f) { + return Matrix::zero(n); + } + + // for all rows below diagonal + for (size_t i = (n + 1); i < N; i++) { + L(i, n) = U(i, n) / U(n, n); + + // add i-th row and n-th row + // multiplied by: -a(i,n)/a(n,n) + for (size_t k = n; k < N; k++) { + U(i, k) -= L(i, n) * U(n, k); + } + } + } + + //printf("L:\n"); L.print(); + //printf("U:\n"); U.print(); + + // solve LY=P*I for Y by forward subst + Matrix Y = P; + + // for all columns of Y + for (size_t c = 0; c < N; c++) { + // for all rows of L + for (size_t i = 0; i < N; i++) { + // for all columns of L + for (size_t j = 0; j < i; j++) { + // for all existing y + // subtract the component they + // contribute to the solution + Y(i, c) -= L(i, j) * Y(j, c); + } + + // divide by the factor + // on current + // term to be solved + // Y(i,c) /= L(i,i); + // but L(i,i) = 1.0 + } + } + + //printf("Y:\n"); Y.print(); + + // solve Ux=y for x by back subst + Matrix X = Y; + + // for all columns of X + for (size_t c = 0; c < N; c++) { + // for all rows of U + for (size_t k = 0; k < N; k++) { + // have to go in reverse order + size_t i = N - 1 - k; + + // for all columns of U + for (size_t j = i + 1; j < N; j++) { + // for all existing x + // subtract the component they + // contribute to the solution + X(i, c) -= U(i, j) * X(j, c); + } + + // divide by the factor + // on current + // term to be solved + X(i, c) /= U(i, i); + } + } + + //printf("X:\n"); X.print(); + return X; + } + inline void setAll(const float &val) { + for (size_t i = 0; i < getRows(); i++) { + for (size_t j = 0; j < getCols(); j++) { + (*this)(i, j) = val; + } + } + } + inline void set(const float *data) { + memcpy(getData(), data, getSize()); + } + inline size_t getRows() const { return _rows; } + inline size_t getCols() const { return _cols; } + inline static Matrix identity(size_t size) { + Matrix result(size, size); + + for (size_t i = 0; i < size; i++) { + result(i, i) = 1.0f; + } + + return result; + } + inline static Matrix zero(size_t size) { + Matrix result(size, size); + result.setAll(0.0f); + return result; + } + inline static Matrix zero(size_t m, size_t n) { + Matrix result(m, n); + result.setAll(0.0f); + return result; + } protected: - inline size_t getSize() const { return sizeof(float)*getRows()*getCols(); } - inline float * getData() { return _data; } - inline const float * getData() const { return _data; } - inline void setData(float * data) { _data = data; } + inline size_t getSize() const { return sizeof(float) * getRows() * getCols(); } + inline float *getData() { return _data; } + inline const float *getData() const { return _data; } + inline void setData(float *data) { _data = data; } private: - size_t _rows; - size_t _cols; - float * _data; + size_t _rows; + size_t _cols; + float *_data; }; } // namespace math diff --git a/apps/systemlib/math/generic/Vector.hpp b/apps/systemlib/math/generic/Vector.hpp index 4d867f3603..01cfa8bc08 100644 --- a/apps/systemlib/math/generic/Vector.hpp +++ b/apps/systemlib/math/generic/Vector.hpp @@ -51,190 +51,177 @@ namespace math { -class __EXPORT Vector { +class __EXPORT Vector +{ public: - // constructor - Vector(size_t rows) : - _rows(rows), - _data((float*)calloc(rows,sizeof(float))) - { - } - Vector(size_t rows, const float * data) : - _rows(rows), - _data((float*)malloc(getSize())) - { - memcpy(getData(),data,getSize()); - } - // deconstructor - virtual ~Vector() - { - delete [] getData(); - } - // copy constructor (deep) - Vector(const Vector & right) : - _rows(right.getRows()), - _data((float*)malloc(getSize())) - { - memcpy(getData(),right.getData(), - right.getSize()); - } - // assignment - inline Vector & operator=(const Vector & right) - { + // constructor + Vector(size_t rows) : + _rows(rows), + _data((float *)calloc(rows, sizeof(float))) { + } + Vector(size_t rows, const float *data) : + _rows(rows), + _data((float *)malloc(getSize())) { + memcpy(getData(), data, getSize()); + } + // deconstructor + virtual ~Vector() { + delete [] getData(); + } + // copy constructor (deep) + Vector(const Vector &right) : + _rows(right.getRows()), + _data((float *)malloc(getSize())) { + memcpy(getData(), right.getData(), + right.getSize()); + } + // assignment + inline Vector &operator=(const Vector &right) { #ifdef VECTOR_ASSERT - ASSERT(getRows()==right.getRows()); + ASSERT(getRows() == right.getRows()); #endif - if (this != &right) - { - memcpy(getData(),right.getData(), - right.getSize()); - } - return *this; - } - // element accessors - inline float& operator()(size_t i) - { + + if (this != &right) { + memcpy(getData(), right.getData(), + right.getSize()); + } + + return *this; + } + // element accessors + inline float &operator()(size_t i) { #ifdef VECTOR_ASSERT - ASSERT(i 1e-30f) - return false; - } - return true; - } - // scalar ops - inline Vector operator+(const float & right) const - { - Vector result(getRows()); - for (size_t i=0; i 1e-30f) + return false; + } + + return true; + } + // scalar ops + inline Vector operator+(const float &right) const { + Vector result(getRows()); + + for (size_t i = 0; i < getRows(); i++) { + result(i) = (*this)(i) + right; + } + + return result; + } + inline Vector operator-(const float &right) const { + Vector result(getRows()); + + for (size_t i = 0; i < getRows(); i++) { + result(i) = (*this)(i) - right; + } + + return result; + } + inline Vector operator*(const float &right) const { + Vector result(getRows()); + + for (size_t i = 0; i < getRows(); i++) { + result(i) = (*this)(i) * right; + } + + return result; + } + inline Vector operator/(const float &right) const { + Vector result(getRows()); + + for (size_t i = 0; i < getRows(); i++) { + result(i) = (*this)(i) / right; + } + + return result; + } + // vector ops + inline Vector operator+(const Vector &right) const { #ifdef VECTOR_ASSERT - ASSERT(getRows()==right.getRows()); + ASSERT(getRows() == right.getRows()); #endif - Vector result(getRows()); - for (size_t i=0; iepsilon) - { - printf("not equal ->\n\ta: %12.8f\n\tb: %12.8f\n", double(a), double(b)); - return false; - } - else return true; + float diff = fabsf(a - b); + + if (diff > epsilon) { + printf("not equal ->\n\ta: %12.8f\n\tb: %12.8f\n", double(a), double(b)); + return false; + + } else return true; } void __EXPORT float2SigExp( - const float & num, - float & sig, - int & exp) + const float &num, + float &sig, + int &exp) { - if (isnan(num) || isinf(num)) - { - sig = 0.0f; - exp = -99; - return; - } - if (fabsf(num) < 1.0e-38f) - { - sig = 0; - exp = 0; - return; - } - exp = log10f(fabsf(num)); - if (exp>0) { - exp = ceil(exp); - } else { - exp = floor(exp); - } - sig = num; - // cheap power since it is integer - if (exp>0) { - for (int i=0;i 0) { + exp = ceil(exp); + + } else { + exp = floor(exp); + } + + sig = num; + + // cheap power since it is integer + if (exp > 0) { + for (int i = 0; i < abs(exp); i++) sig /= 10; + + } else { + for (int i = 0; i < abs(exp); i++) sig *= 10; + } } diff --git a/apps/systemlib/test/test.hpp b/apps/systemlib/test/test.hpp index 860758e7d1..841c421445 100644 --- a/apps/systemlib/test/test.hpp +++ b/apps/systemlib/test/test.hpp @@ -45,6 +45,6 @@ bool equal(float a, float b, float eps = 1e-5); void float2SigExp( - const float & num, - float & sig, - int & exp); + const float &num, + float &sig, + int &exp);