我确信这个问题的答案很简单,但我还没有得到c ++的要点,如果这是愚蠢的或者已经得到回答,那就很抱歉。
我有Eigen
个Boost
间隔的向量,由
#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等方法?
提前致谢
答案 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]