Boost logo

Boost Users :

Subject: [Boost-users] [uBLAS] Matrix creation vs resize
From: Ryan (mccorywork_at_[hidden])
Date: 2011-03-23 16:59:07


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;
  }
}



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net