Сделать стандартный вектор собственных векторов из собственной матрицы - PullRequest
0 голосов
/ 10 октября 2019

У меня есть Eigen::MatrixXd, который я сделал из std::vector из Eigen::Vector3d. Это было легко.

Я сделал некоторые манипуляции с преобразованиями в этой матрице, и я хочу получить возвращаемый результат как стандартный вектор Eigen::Vector3d.

Как я могу сделать

std::vector<Eigen::Vector3d>форма Eigen::Matrix3d?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Лучше придерживаться объекта 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сначала и заново создайте Map с новым размером.

1 голос
/ 10 октября 2019

Я согласен с @ggael и @RHertel, что вы должны придерживаться одного представления. Если вам нужно динамически вставлять Vector3d объекты, то, вероятно, std::vector является лучшим решением (и вы все равно можете получить к нему доступ, как к объекту Eigen, используя Eigen::Map, как показано ggael).

Аналогично,если у вас есть 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

...