Boost logo

Boost :

From: David Cameron (dave.bc_at_[hidden])
Date: 2005-11-02 03:04:04

I've been writing some code to serialize and deserialize
boost::numeric::ublas::matrixs. While writing unit tests for it I
found out about the boost::numeric::ublas::equals function in
matrix_assign.hpp. I was relieved, because I had previously been using
a templated function to compare matrices.

Unfortunately, it doesn't work for me with matrix<int>s. Consider the
following cppunit test code:

  void testMatrixEqualsOperator() {
     using namespace boost::numeric::ublas;
     matrix<double> test;
     CPPUNIT_ASSERT( equals(test,test) );

     matrix<int> test1;
     CPPUNIT_ASSERT( equals(test1,test1) );

The first four lines work. Adding the next three lines causes the unit
tests to fail with an Abort. This is not the standard way CppUnit
records a failed test, it must be something failing inside the call to

Previous messages referring to the equals() function argued that it
wasn't ready for use because there was rarely a need to compare
matrices in real applications. I would argue that it should be working
as intended, if only to allow for proper unit testing of code that
uses matrices.

Here is the function I have been using instead. It works well for me
with doubles and ints. Although, I imagine it is not particularly
fast. E is for Element.

  template<class E>
  bool areMatricesEqual(
    boost::numeric::ublas::matrix<E> lhs,
    boost::numeric::ublas::matrix<E> rhs)
    using boost::numeric::ublas;

    if (&lhs == &rhs)
        return true;
    if (lhs.size1() != rhs.size1())
        return false;
    if (lhs.size2() != rhs.size2())
        return false;
    typename matrix<E>::iterator1 l(lhs.begin1());
    typename matrix<E>::iterator1 r(rhs.begin1());
    while (l != lhs.end1()) {
        if (*l != *r)
            return false;
    return true;

I am using gcc-3.3 on ubuntu-5.04 running on an AthlonXP. I'd be happy
to provide any more info to help track down the bug. Assuming it is

David Cameron
University of British Columbia

Boost list run by bdawes at, gregod at, cpdaniel at, john at