用std::vector初始化Eigen::vector
Initialise Eigen::vector with std::vector
我以前见过这样做,但我不记得如何有效地用相同长度的std::vector
初始化已知长度的Eigen::Vector
。下面是一个很好的例子:
std::vector<double> v1 = {1.0, 2.0, 3.0};
Eigen::Vector3d v2; // Do I put it like this in here: v2(v1) ?
v2 << v1[0], v1[1], v1[2]; // I know you can do it like this but
// I am sure i have seen a one liner.
我已经仔细阅读了这个关于高级矩阵初始化的页面,但是没有明确的解释执行此操作的方法。
根据Eigen Doc, Vector是Matrix的类型定义,而Matrix有一个具有以下签名的构造函数:
Matrix (const Scalar *data)
构造一个固定大小的矩阵,初始化系数从data开始。
和向量引用将std::vector::data
定义为:
std::vector::data T* data(); const T* data() const;
返回指向作为元素存储的底层数组的指针。指针是这样的,范围
[data(); data() + size())
总是a有效范围,即使容器为空。
因此,您可以将vector的数据作为Vector3d
构造函数参数传递:
Eigen::Vector3d v2(v1.data());
同样,从特征3.2.8开始,上面提到的构造函数定义为:
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
inline Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>
::Matrix(const Scalar *data)
{
this->_set_noalias(Eigen::Map<const Matrix>(data));
}
如您所见,它也使用Eigen::Map
,如@ggael和@gongzhitaao所示。
只是为了扩展@ggael的答案,以防其他人没有注意到:
来自快速参考指南:映射外部数组:
float data[] = {1,2,3,4};
Map<Vector3f> v1(data); // uses v1 as a Vector3f object
Map<ArrayXf> v2(data,3); // uses v2 as a ArrayXf object
Map<Array22f> m1(data); // uses m1 as a Array22f object
Map<MatrixXf> m2(data,2,2); // uses m2 as a MatrixXf object
下面的一行应该更正确:
#include <Eigen/Dense>
#include <Eigen/Core>
std::vector<double> a = {1, 2, 3, 4};
Eigen::VectorXd b = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(a.data(), a.size());
我找到了一个更好的答案:
https://forum.kde.org/viewtopic.php?f=74& t = 94839
基本上首先创建一个指向std vector的指针,然后使用Map将指针和长度传递给构造函数。
此方法适用于Eigen中的动态Vector对象。当我尝试使用.data()函数从std矢量作为第一个答案建议,它给了我一个错误:静态断言失败:you_called_a_fixed_size_method_on_dynamic_size_matrix_or_vector
但是使用这个方法它是有效的!
我只是从这里的链接复制并粘贴相关代码:
std::vector<double> v(4, 100.0);
double* ptr = &v[0];
Eigen::Map<Eigen::VectorXd> my_vect(ptr, 4);
有两种选择。如果您希望Eigen::VectorXd
与std::vector
共享内存,请使用
Eigen::Map<Eigen::VectorXd> b(v1.data(), v1.size());
否则(做一个深拷贝),使用
Eigen::VectorXd a = Eigen::Map<Eigen::VectorXd>(v1.data(), v1.size());
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 将数据从 std::Vector 存储到 Eigen::Vector 时出错
- C++:如何将 std::vector 操作转换为 Eigen::VectorXf?
- 以 Eigen::Vector 作为参数
- Eigen::MatrixXd.block assignment using a std::vector
- 将 Eigen::P ermutationMatrix.indices() 转换为 array/vector
- 如何将 Eigen::Matrix 映射到 std::vector<Eigen::vector>?
- 何时使用 Eigen::Vector vs std::vector
- 有一个具有映射到 std::vector 属性的 Eigen::matrix 属性的类
- Create Eigen::Ref from std::vector
- 将PCL点类型XYZ转换为EIGEN VECTOR 4F
- 将数据从 std::vector 复制到 Eigen's MatrixXd in C++
- 在 odeint 中使用 std::vector<Eigen::Vector3d> 作为状态类型
- 使用 std::vector<Eigen::MatrixXd 进行内存管理>
- 如何从Eigen中的索引向量中提取子向量(Eigen::Vector)
- 将Eigen::VectorXd类型转换为std::vector
- Eigen+std::vector+OpenMP的内存泄漏
- 用std::vector初始化Eigen::vector
- 为Eigen和std::vector编写模板函数
- 对Eigen::Vector类型使用Boost累加器