I need to remove rows from a matrix if it fails a comparison. I have two possible options to remove the matrix rows. Option 1 adds a row to the new matrix for each row from the old matrix that passes the comparison. Option 2 keeps track of the rows from the old matrix that passed the comparison and then creates a new matrix all at once. I'm wondering which option is more efficient or is there a simpler way to achieve the same results?
Ryan
Option 1
void(
matrix<double> const& H,
matrix<double> const& P,
matrix<double> const& R,
vector<double> const& v)
{
double const rejection_criterion = 2;
matrix<double> M = prod(H, matrix<double>(prod(P, trans(H))) + R;
matrix<double> result;
int matrix_size = 1;
for (unsigned i = 0; i < v.size(); ++i) {
if ( v[i] * v[i] < rejection_criterion * M(i,i)) {
result.resize(matrix_size, H.size2(), true);
matrix_row<matrix<double> > oldH (H, i);
matrix_row<matrix<double> > newH (result, matrix_size - 1);
newH = oldH;
matrix_size++;
}
}
}
Option 2
void(
matrix<double> const& H,
matrix<double> const& P,
matrix<double> const& R,
vector<double> const& v)
{
double const rejection_criterion = 2;
matrix<double> M = prod(H, matrix<double>(prod(P, trans(H))) + R;
list<unsigned> goodrows;
for (unsigned i = 0; i < v.size(); ++i) {
if ( v[i] * v[i] < rejection_criterion * M(i,i)) {
goodrows.push_back(i);
}
}
matrix<double> result(goodrows.size(), H.size2());
for (
unsigned i = 0, list<unsigned>::iterator iter = goodrows.begin();
i < result.size1();
++i, ++iter) {
matrix_row<matrix<double> > oldH (H, *iter);
matrix_row<matrix<double> > newH (result, i);
newH = oldH;
}
}