我有一个Eigen::MatrixXd
,由std::vector
的{{1}}制成。很简单。
我对该矩阵进行了一些转换操作,我希望返回结果作为Eigen::Vector3d
的std向量。
我怎么做
Eigen::Vector3d
表格std::vector<Eigen::Vector3d>
答案 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
,但是,当然,如果您已经有vecs
或Matrix3Xf
并想要复制它到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