У меня есть матрица структур, где каждая структура содержит два значения. Я пытаюсь расширить Eigen некоторым способом, который позволит мне читать матрицу структур до двух матриц значений без необходимости повторять матрицу структур дважды (т.е. один раз для каждого значения):
template <typename T>
struct dummy_str{
T a_;
T b_;
};
int main()
{
dummy_str<double> d1;
d1.a_ = 0;
d1.b_ = 1;
Eigen::Matrix<dummy_str<double>, -1, -1> d_mat(2, 2);
d_mat << d1, d1, d1, d1;
Eigen::MatrixXd a_out(2,2);
Eigen::MatrixXd b_out(2,2);
//Trying to implement something like this:
//d_mat.read_struct(a_out, b_out);
}
Какой из методов настройки Эйгена (если есть) позволил бы мне реализовать это? Самое близкое, что я пришел, - это добавление CwiseUnaryOp для чтения каждого значения в выражении void с использованием дополнений MatrixBase, но это все равно будет проходить через матрицу дважды:
template<typename OtherDerived>
void read_struct(OtherDerived& other1, OtherDerived& other2) {
other1.derived() = derived().read_a();
other2.derived() = derived().read_b();
}
Есть ли более эффективное решение, которое можно найти здесь?
РЕДАКТИРОВАТЬ: мне удалось добиться того, что я хочу с NullaryExpr, но это работает только с неконстантными вводами.
template <typename OtherDerived>
auto read_struct(OtherDerived& other1, OtherDerived& other2) {
return Derived::NullaryExpr(derived().rows(), derived().cols(),
[&] (Index i, Index j){
other1.derived().coeffRef(i,j) = derived().coeff(i,j).a_;
other2.derived().coeffRef(i,j) = derived().coeff(i,j).b_;
});
}
Если я пытаюсь использовать вышеупомянутый expr с входная матрица const (d_mat
в первом примере) с ошибкой при отбрасывании квалификаторов.