从特征矩阵生成特征向量的std向量

时间:2019-10-10 09:10:01

标签: c++ std eigen

我有一个Eigen::MatrixXd,由std::vector的{​​{1}}制成。很简单。

我对该矩阵进行了一些转换操作,我希望返回结果作为Eigen::Vector3d的std向量。

我怎么做

Eigen::Vector3d表格std::vector<Eigen::Vector3d>

2 个答案:

答案 0 :(得分:2)

最好坚持使用--- title: "Title" date: "`r Sys.Date()`" author: "Author" output: beamer_presentation: keep_tex: true header-includes: - \renewcommand{\tightlist}{\setlength{\itemsep}{5ex}\setlength{\parskip}{0pt}} --- ## Slide 1 - Bullet point 1 - Bullet point 2 对象。这是我通常处理此类情况的方式:

std::vector

这将为std::vector<Vector3d> vecs(n); auto mat = Matrix3Xd::Map(vecs[0].data(), 3, vecs.size()); 拥有的数据创建一个视图。然后随心所欲地玩vecs(当然,除了调整大小!)外,例如:

mat

无需将值从mat = my_affine * mat; 复制回mat,但是,当然,如果您已经有vecsMatrix3Xf并想要复制它到MatrixXf,然后简单地写:

vecs

提供了mat = other_mat; ,否则您需要先调整vecs.size() == other_mat.cols()的大小并重新创建一个具有新大小的vecs

答案 1 :(得分:1)

我同意@ggael和@RHertel的观点,即您应该坚持一个代表。如果您需要动态插入Vector3d个对象,那么std::vector可能是更好的解决方案(并且您仍然可以像使用Eigen对象一样使用ggael所示的Eigen::Map来访问它)。

同样,如果您有一个Matrix3Xd并想在标准算法中按列使用它,则可以使用.colwise().begin().colwise().end()来完成,它们本身不会复制任何数据(这需要Eigen的开发部门-或即将推出的3.4版本)。

这也提供了一种从std::vector创建Eigen::Matrix3Xd的简便方法:

// `mat` needs to have 3 rows (at runtime)
std::vector<Eigen::Vector3d> vec(mat.colwise().begin(), mat.colwise().end());

Godbolt-Demo:https://godbolt.org/z/uCqZni