Added and tested whitening parameter for matrix() and matrix_augmented()

release/4.3a0
Alex Cunningham 2010-01-19 16:52:01 +00:00
parent fbee0bd749
commit fb0ca07bf1
3 changed files with 52 additions and 11 deletions

View File

@ -215,7 +215,7 @@ pair<Matrix,Vector> GaussianFactor::matrix(const Ordering& ordering, bool weight
}
/* ************************************************************************* */
Matrix GaussianFactor::matrix_augmented(const Ordering& ordering) const {
Matrix GaussianFactor::matrix_augmented(const Ordering& ordering, bool weight) const {
// get pointers to the matrices
vector<const Matrix *> matrices;
BOOST_FOREACH(const Symbol& j, ordering) {
@ -229,7 +229,11 @@ Matrix GaussianFactor::matrix_augmented(const Ordering& ordering) const {
B_mat(i,0) = b_(i);
matrices.push_back(&B_mat);
return collect(matrices);
// divide in sigma so error is indeed 0.5*|Ax-b|
Matrix Ab = collect(matrices);
if (weight) model_->WhitenInPlace(Ab);
return Ab;
}
/* ************************************************************************* */

View File

@ -233,10 +233,10 @@ public:
/**
* Return (dense) matrix associated with factor
* The returned system is an augmented matrix: [A b]
* The standard deviations are NOT baked into A and b
* @param ordering of variables needed for matrix column order
* @param set weight to use whitening to bake in weights
*/
Matrix matrix_augmented(const Ordering& ordering) const;
Matrix matrix_augmented(const Ordering& ordering, bool weight = true) const;
/**
* Return vectors i, j, and s to generate an m-by-n sparse matrix

View File

@ -25,6 +25,7 @@ using namespace boost::assign;
using namespace std;
using namespace gtsam;
using namespace example;
using namespace boost;
/* ************************************************************************* */
TEST( GaussianFactor, linearFactor )
@ -510,16 +511,36 @@ TEST( GaussianFactor, matrix )
Ordering ord;
ord += "x1","x2";
Matrix A; Vector b;
boost::tie(A,b) = lf->matrix(ord);
// Test whitened version
Matrix A_act1; Vector b_act1;
boost::tie(A_act1,b_act1) = lf->matrix(ord, true);
Matrix A1 = Matrix_(2,4,
-10.0, 0.0, 10.0, 0.0,
000.0,-10.0, 0.0, 10.0 );
Vector b1 = Vector_(2, 2.0, -1.0);
EQUALITY(A,A1);
EQUALITY(b,b1);
EQUALITY(A_act1,A1);
EQUALITY(b_act1,b1);
// Test unwhitened version
Matrix A_act2; Vector b_act2;
boost::tie(A_act2,b_act2) = lf->matrix(ord, false);
Matrix A2 = Matrix_(2,4,
-1.0, 0.0, 1.0, 0.0,
000.0,-1.0, 0.0, 1.0 );
Vector b2 = Vector_(2, 0.2, -0.1);
EQUALITY(A_act2,A2);
EQUALITY(b_act2,b2);
// Ensure that whitening is consistent
shared_ptr<noiseModel::Gaussian> model = lf->get_model();
model->WhitenSystem(A_act2, b_act2);
EQUALITY(A_act1, A_act2);
EQUALITY(b_act1, b_act2);
}
/* ************************************************************************* */
@ -535,14 +556,30 @@ TEST( GaussianFactor, matrix_aug )
Ordering ord;
ord += "x1","x2";
Matrix Ab;
Ab = lf->matrix_augmented(ord);
// Test unwhitened version
Matrix Ab_act1;
Ab_act1 = lf->matrix_augmented(ord, false);
Matrix Ab1 = Matrix_(2,5,
-1.0, 0.0, 1.0, 0.0, 0.2,
00.0,- 1.0, 0.0, 1.0, -0.1 );
EQUALITY(Ab,Ab1);
EQUALITY(Ab_act1,Ab1);
// Test whitened version
Matrix Ab_act2;
Ab_act2 = lf->matrix_augmented(ord, true);
Matrix Ab2 = Matrix_(2,5,
-10.0, 0.0, 10.0, 0.0, 2.0,
00.0, -10.0, 0.0, 10.0, -1.0 );
EQUALITY(Ab_act2,Ab2);
// Ensure that whitening is consistent
shared_ptr<noiseModel::Gaussian> model = lf->get_model();
model->WhitenInPlace(Ab_act1);
EQUALITY(Ab_act1, Ab_act2);
}
/* ************************************************************************* */