[英]Make std vector of Eigen vectors from Eigen Matrix
我有一个由Eigen::MatrixXd
的std::vector
制作的Eigen::Vector3d
。 很容易。
我对该矩阵进行了一些变换操作,我希望将结果作为Eigen::Vector3d
的标准向量返回。
我怎么能做
std::vector<Eigen::Vector3d>
形成Eigen::Matrix3d?
最好坚持使用std::vector
object。 以下是我通常处理此类情况的方式:
std::vector<Vector3d> vecs(n);
auto mat = Matrix3Xd::Map(vecs[0].data(), 3, vecs.size());
这将创建vecs
拥有的数据的视图。 然后随心所欲地玩mat
(当然调整大小除外)。 例如::
mat = my_affine * mat;
无需将值从mat
复制回vecs
,但当然,如果您手头已有Matrix3Xf
或MatrixXf
并想将其复制到vecs
,则只需编写:
mat = other_mat;
前提是vecs.size() == other_mat.cols()
,否则您需要先调整vecs
的大小并重新创建具有新大小的Map
。
我同意@ggael 和@RHertel 的观点,即你应该坚持一种表示。 如果您需要动态插入Vector3d
对象,那么std::vector
可能是更好的解决方案(并且您仍然可以像 Eigen object 一样使用Eigen::Map
访问它,如 ggael 所示)。
同样,如果您有一个Matrix3Xd
并希望在标准算法中按列使用它,您可以使用.colwise().begin()
和.colwise().end()
来做到这一点,它们本身不会复制任何数据(这需要 Eigen 的开发分支——或即将推出的 3.4 版本)。
这也提供了一种从Eigen::Matrix3Xd
创建std::vector
的简单方法:
// `mat` needs to have 3 rows (at runtime)
std::vector<Eigen::Vector3d> vec(mat.colwise().begin(), mat.colwise().end());
Godbolt 演示: https://godbolt.org/z/uCqZni
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.