[英]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.