将Boost间隔扩展为标量乘法

时间:2018-01-26 07:50:09

标签: c++ performance boost

我确信这个问题的答案很简单,但我还没有得到c ++的要点,如果这是愚蠢的或者已经得到回答,那就很抱歉。

我有EigenBoost间隔的向量,由

给出
#include <eigen3/Eigen/Dense>
#include <boost/numeric/interval.hpp>

namespace bn = boost::numeric;
namespace bi = bn::interval_lib;

using Interval = bn::interval<
        double,
        bi::policies<
            bi::save_state<bi::rounded_transc_std<double> >,
            bi::checking_base<double>
        >
    >;
using Matrix = Eigen::Matrix<Interval, 3, 3>;
using Vector = Eigen::Matrix<Interval, 3, 1>;

我希望能够使用通常的双打矢量来获取这些矢量的常用矩阵/矢量积。最终我也想要一个内在的产品。 但是现在,增强间隔似乎不支持间隔和双倍的操作数乘法。我的问题是,我将如何继续重载所述乘法? 以下解决方案

Interval operator* (double x, const Interval& y)
    {
        double lower;
        double upper;
        lower = x*y.lower();
        upper = x*y.upper();
        if(upper>lower){ return Interval(lower,upper);}
        else{ return Interval(upper,lower); }
    }

但我对表现感到担忧,并希望以更好的方式听取意见。 此外,为了定义标量和区间向量的乘法,我会选择仅循环遍历区间元素并使用区间乘以上面的标量乘法,这似乎不是很有效。有没有更自然,更快,更多的c ++方法来做到这一点?我是否必须重载更多的运算符才能在带有interval和double条目的两个向量上使用std :: inner_product等方法?

提前致谢

1 个答案:

答案 0 :(得分:1)

您的函数重新定义了库运算符:

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

<强> Live On Coliru

#include <boost/numeric/interval.hpp>

namespace bi = boost::numeric::interval_lib;

using Interval = boost::numeric::interval<
    double, bi::policies<
        bi::save_state<bi::rounded_transc_std<double> >, bi::checking_base<double> 
    > >;

#include <boost/numeric/interval/io.hpp>
#include <iostream>
int main() {
    Interval i{1.9, 2.1};
    std::cout << (2.0 * i) << "\n";
    std::cout << (i * 2.0) << "\n";
}

打印

[3.8,4.2]
[3.8,4.2]