Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost区间矩阵_C++_Matrix_Boost_Intervals - Fatal编程技术网

C++ boost区间矩阵

C++ boost区间矩阵,c++,matrix,boost,intervals,C++,Matrix,Boost,Intervals,我正在尝试使用区间算法为R^n->R^m函数编写一个“分而治之”的根估计算法。我以前在Python上做过这个,但是性能太慢,所以我决定给C++一个GO,我是一个初学者。p> 我搜索了一段时间以找到Boosts间隔库,它似乎可以方便地处理我的问题。但是,我需要用这样的间隔矩阵进行计算。因为我以后需要使用区间中点的矩阵并(伪)反转它们,所以我认为Eigen可能是表示矩阵的一种好方法 我的问题:这种方法真的是个好主意吗,特别是在性能方面?若真是这样,我将如何使这样一个矩阵能够包含区间作为条目,并处理基

我正在尝试使用区间算法为R^n->R^m函数编写一个“分而治之”的根估计算法。我以前在Python上做过这个,但是性能太慢,所以我决定给C++一个GO,我是一个初学者。p> 我搜索了一段时间以找到Boosts间隔库,它似乎可以方便地处理我的问题。但是,我需要用这样的间隔矩阵进行计算。因为我以后需要使用区间中点的矩阵并(伪)反转它们,所以我认为
Eigen
可能是表示矩阵的一种好方法

我的问题:这种方法真的是个好主意吗,特别是在性能方面?若真是这样,我将如何使这样一个矩阵能够包含区间作为条目,并处理基本运算(矩阵乘法等)

我希望能够做到的一个例子:

#include <eigen3/Eigen/Dense>
#include <boost/numeric/interval.hpp>
using Eigen::MatrixXd;
using Eigen::VectorXd;
int main()
{
  MatrixXd m(2,2);
  VectorXd v(2);
  Interval i1(0.0, 1.0);
  Interval i2(1.0, 2.0);
  Interval i3(0.0, 0.0);
  m(0,0) = i1;
  m(1,0) = i3;
  m(0,1) = i3;
  m(1,1) = i1;

  v(0) = i1;
  v(1) = i2;

  std::cout << m*v << std::endl;
}
#包括
#包括
使用特征::矩阵XXD;
使用特征::VectorXd;
int main()
{
矩阵m(2,2);
向量xd v(2);
区间i1(0.0,1.0);
区间i2(1.0,2.0);
区间i3(0.0,0.0);
m(0,0)=i1;
m(1,0)=i3;
m(0,1)=i3;
m(1,1)=i1;
v(0)=i1;
v(1)=i2;
标准::cout>,
boost::numeric::interval_lib::checking_base>>”)
欢迎任何(noob级别!)参考和建议。


当然,您可以使用
Dynamic
extends.

C++是一种编译语言。您在编译或运行程序时是否遇到错误?如果您在编译程序时遇到错误,编译器应该准确地告诉您是哪一行。它打印出来的文本非常详细且信息丰富;摘要通常不太有用。请将其全部复制并保存用5个前导空格引用。@Yakk我附加了完整的错误。我想我必须重写矩阵类型,以将间隔也作为标量,但我真的不知道该怎么做。不要使用方便的类型def MatrixXd,使用带有正确模板参数的主矩阵类型(参见文档,正确的选择是显而易见的)。根据您想要执行的操作,您可能需要为此(间隔)专门化一些特征数字类型,请参阅有关自定义数字类型的文档。这不是完全错误。完全错误将包括行号等内容。它还可能包括一整堆其他附带错误。发生错误的行很有用。任何其他附带错误垃圾邮件也是一样。如果您使用gui,gui可能会隐藏完整错误r来自您。@Yakk我使用的是atom,我漏掉了这一行(它在输出中是分开的,所以我有点忘记了,但是在这个特定的代码中,我在所有的m和v赋值上都有错误),否则这就是显示的所有内容:/原则上正是我想要的,但是“(m*v).eval();”第行抛出错误,即*操作数类型在“矩阵”和“向量”之间不明确,我是否遗漏了什么?使用g++、c++14、boost 1.66和eigen 3.3.4进行编译。相应的错误对于注释部分来说太长:/I可以使用m.lazydroduct(v)解决它,但我不明白问题是什么,我可能为此付出了性能代价,对吗?我猜您使用了
Dynamic
,和/或在另一个版本中使用了Eigen/配置不同,在这种情况下
m*v
可能不会产生表达式模板。请参见-Anyhoops,对我也适用。没有使用Dynamic,但可能是不同的版本。你在哪个版本和编译器上运行这个?gcc 7,eigen3(3.3~beta1-2 ubuntu包libeigen3 dev),boost 1.66
 typedef boost::numeric::interval<double, boost::numeric::interval_lib::policies
                            <boost::numeric::interval_lib::save_state
                            <boost::numeric::interval_lib::rounded_transc_std<double> >,
                            boost::numeric::interval_lib::checking_base<double> > > Interval;
assigning to 'Scalar' (aka 'double') from incompatible type 'Interval'
(aka 'interval < double, boost::numeric::interval_lib::policies <
boost::numeric::interval_lib::save_state <
boost::numeric::interval_lib::rounded_transc_std < double > >,
boost::numeric::interval_lib::checking_base<double> > >')
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
#include <boost/numeric/interval.hpp>
#include <boost/numeric/interval/utility.hpp>
#include <boost/numeric/interval/io.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>
        > 
    >;

#include <eigen3/Eigen/Dense>
using Matrix = Eigen::Matrix<Interval, 2, 2>;
using Vector = Eigen::Matrix<Interval, 2, 1>;

#include <iostream>

int main() {
    Matrix m;
    m << 
       Interval {0.0, 1.0},
       Interval {0.0, 0.0},
       Interval {0.0, 0.0},
       Interval {0.0, 1.0};

    Vector v;
    v << 
       Interval {0.0, 1.0},
       Interval {1.0, 2.0};

    Vector prod = (m*v).eval();

    std::cout << prod(0,0) << std::endl;
    std::cout << prod(1,0) << std::endl;
}
[0,1]
[0,2]