Operator overloading for Boost interval (vectors)
I'll start by saying I haven't used boost::numeric, so what I say here is based on a quick skim of its documentation and source.

Instead of writing the constant 3 in so much of the code, we should be using rows() or cols() as appropriate (or perhaps even RowsAtCompileTime and ColsAtCompileTime).

Don't pass simple value types by reference - double values should be simply passed by value.

In fact, since Eigen::Matrix has a member that multiplies by a scalar, we can simplify these functions by simply calling that.  All we have to do is swap the argument order:

Vector operator*(double x, Vector y)
{
    return y *= x;
}

Matrix operator*(double x, const Matrix&amp; y)
{
    return y * x;
}


We can also simplify the dot-product function by using the standard inner_product algorithm.  We need to know that a vector's start and end iterators are obtained by data() and data() + size() respectively:

#include &lt;numeric&gt;

Interval inner_prod(const Vector&amp; x, const Vector&amp; y)
{
    return std::inner_product(x.data(), x.data() + x.size(),
                              y.data(), Interval{});
}

Interval inner_prod(const std::vector&lt;double&gt;&amp; x, const Vector&amp; y)
{
    if (x.size() != y.size())
        return {};              // or throw an exception, or something
    return std::inner_product(x.begin(), x.end(),
                              y.data(), Interval{});
}