Eigen - добавить метод для записи в две матрицы одновременно - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть матрица структур, где каждая структура содержит два значения. Я пытаюсь расширить 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 в первом примере) с ошибкой при отбрасывании квалификаторов.

...