如何为特征矩阵创建 STL 输出迭代器?
How to create an STL output iterator for a Eigen matrix?
假设你有一个 Eigen::Matrix<float, Eigen::Dynamic, 3> m;
。现在您有 Eigen 之外的数据,并希望使用 STL 算法(例如 std::transform
)将其移动到您的矩阵中。 documentation gives examples on how to use m.rowwise()
in a range-based for loop. However, passing m.rowwise()
as the output iterator of std::transform
does not work. It complains that VectorwiseOp
does not have an operator++
. A range-based for loop would call the begin()
method of the range expression anyhow, but the VectorwiseOp
does not have 一个 begin()
方法。
说我有一个 std::vector<std::tuple<float, float, float>> i;
。我如何将其转换为矩阵?当然,可以在此处对索引变量使用普通循环,但是当使用更复杂的输入数据结构时,这会变得困难。然后,可以使用 std::for_each
并在外部维护输出索引,但这看起来很笨拙。我正在寻找类似
的内容
std::transform(
i.cbegin(),
i.cend(),
/* TODO: something like m.rowwise() */,
[](const std::tuple<float, float, float> &e) -> /* TODO */ {
/* don't care here */
});
Eigen::VectorwiseOp<ET, D>
在 Eigen 3.4 中获得适当的 begin
和 end
,您正在查看 3.3 的源代码。
如果升级到3.4,简直了
std::transform(
i.cbegin(),
i.cend(),
m.rowwise().begin(),
[](const std::tuple<float, float, float> &e) -> decltype(*m.rowwise().begin()) {
/* don't care here */
});
假设你有一个 Eigen::Matrix<float, Eigen::Dynamic, 3> m;
。现在您有 Eigen 之外的数据,并希望使用 STL 算法(例如 std::transform
)将其移动到您的矩阵中。 documentation gives examples on how to use m.rowwise()
in a range-based for loop. However, passing m.rowwise()
as the output iterator of std::transform
does not work. It complains that VectorwiseOp
does not have an operator++
. A range-based for loop would call the begin()
method of the range expression anyhow, but the VectorwiseOp
does not have 一个 begin()
方法。
说我有一个 std::vector<std::tuple<float, float, float>> i;
。我如何将其转换为矩阵?当然,可以在此处对索引变量使用普通循环,但是当使用更复杂的输入数据结构时,这会变得困难。然后,可以使用 std::for_each
并在外部维护输出索引,但这看起来很笨拙。我正在寻找类似
std::transform(
i.cbegin(),
i.cend(),
/* TODO: something like m.rowwise() */,
[](const std::tuple<float, float, float> &e) -> /* TODO */ {
/* don't care here */
});
Eigen::VectorwiseOp<ET, D>
在 Eigen 3.4 中获得适当的 begin
和 end
,您正在查看 3.3 的源代码。
如果升级到3.4,简直了
std::transform(
i.cbegin(),
i.cend(),
m.rowwise().begin(),
[](const std::tuple<float, float, float> &e) -> decltype(*m.rowwise().begin()) {
/* don't care here */
});