特征占据了一块

时间:2017-11-30 08:31:17

标签: c++ eigen

我有一个大的矢量,我需要访问它的部分分离矢量。为简单起见,假设存在长度为10的向量A.向量B是前五个元素。向量C是B的前三个元素.B和C与A共享内存。

Eigen有几个类来处理这种情况。 RefMapBlock。哪一个是处理上述情况最自然的方式?此外,我特别感兴趣的是B和C在构造过程中从A创建(为了能够在类的成员初始化列表中构建B和C)。

似乎Block是解决方案。但是无法从其他Block创建Block ...

#include "Eigen/Dense"

int main()
{
  Eigen::VectorXd a(10);
  Eigen::VectorBlock<Eigen::VectorXd> b(a, 0, 5);
  Eigen::VectorBlock<Eigen::VectorXd> c(b, 0, 3);
  return 0;
}

产地:

error: no matching constructor for initialization of 'Eigen::VectorBlock<Eigen::VectorXd>' (aka
      'VectorBlock<Matrix<double, Dynamic, 1> >')
  Eigen::VectorBlock<Eigen::VectorXd> c(b, 0, 3);
                                      ^ ~~~~~~~

2 个答案:

答案 0 :(得分:0)

这是一种罕见的情况,auto非常适合Eigen:

auto b = a.segment(0,5);
auto c = b.segment(0,3);

c的类型将嵌套Block,即Block<Block<VectorXd,...>, ...>。 在这种情况下,Ref也可以使用:

Ref<VectorXd> b = a.segment(0,5);
Ref<VectorXd> c = b.segment(0,3);

这甚至可能更好,因为Ref<VectorXd>对编译器的优化比Block<Block<>>更简单。

答案 1 :(得分:-1)

我只想把我的两分钱放在这上面,因为这可以在不使用auto或Ref或Map的情况下完成。这里有一些工作代码,可以很容易地适应.segment(i,N)如果你想要但是这个代码确实完成了问题想要的使用Vector方法.head(N):

  VectorXd setA;
  VectorXd subsetB;
  VectorXd subsetC;
  setA = VectorXd::Random(10, 1);
  cout << "New" <<endl;
  subsetB = setA.head(5);
  subsetC = subsetB.head(3);
  cout << setA.transpose() << endl;
  cout << "Sub B" << endl;
  cout << subsetB.transpose() << endl;
  cout << "Sub C " << endl;
  cout << subsetC.transpose() << endl;

这是我的输出:

New
 -0.999984  -0.736924   0.511211 -0.0826997  0.0655345  -0.562082  -0.905911   0.357729   0.358593   0.869386
Sub B
 -0.999984  -0.736924   0.511211 -0.0826997  0.0655345
Sub C 
-0.999984 -0.736924  0.511211

这是我的包括:

#include <Eigen/Dense>

使用:

using namespace std;
using namespace Eigen;
相关问题