我有一个大的矢量,我需要访问它的部分分离矢量。为简单起见,假设存在长度为10的向量A.向量B是前五个元素。向量C是B的前三个元素.B和C与A共享内存。
Eigen有几个类来处理这种情况。 Ref
,Map
和Block
。哪一个是处理上述情况最自然的方式?此外,我特别感兴趣的是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);
^ ~~~~~~~
答案 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;