簡體   English   中英

從特征矩陣制作特征向量的標准向量

[英]Make std vector of Eigen vectors from Eigen Matrix

我有一個由Eigen::MatrixXdstd::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 ,但當然,如果您手頭已有Matrix3XfMatrixXf並想將其復制到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM