DenseBase, auto и двоичная операция говорят, что массивы имеют различную форму - PullRequest
0 голосов
/ 15 ноября 2018

Я пишу функцию, которая принимает два DenseBase в качестве аргументов.

Функция использует .derived().array() для преобразования Array и Matrix в Array.

Я устал писать derived много раз и использовать авто.

Но auto приводит к странной ошибке.Эйген жалуется, что x2 и y2 не имеют одинаковую форму.

Если я не хочу много раз писать .derived().array(), что я могу использовать?

Эйгенот https://github.com/eigenteam/eigen-git-mirror.git

#include <Eigen/Eigen>
int main() {
    Eigen::ArrayXf x(3);
    Eigen::ArrayXf y(3);
    x << 1, 2, 3;
    y << 4, 5, 6;
    // x.derived().array() * y.derived().array();
    auto x2 = x.derived().array();
    auto y2 = y.derived().array();
    y2 = x2 * y2; 
}

Ошибка времени выполнения:

CwiseBinaryOp.h:110: ...

Assertion `aLhs.rows() == aRhs.rows() 
           && aLhs.cols() == aRhs.cols()' failed.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете исправить проблему времени выполнения с помощью auto x2 = x.array().derived();, то есть: обратный массив и производный.Но auto здесь не желателен.Вот почему.Допустим, у вас есть:

template <typename T> void foo(DenseBase<T> &x);

Если T - это Array<>, тогда x.array().derived() - это Array<>, а x2 будет глубокой копией x.В этом случае вы хотели бы использовать auto& x2 = ....

Если T - это что-то еще, например, Matrix<>, то auto x2 = x.array().derived(); отлично подходит, но не auto& x2 = ....

Итак, что вы действительно хотите, так это что-то сложное:

internal::ref_selector<std::decay<decltype(x.array().derived())>::type>::non_const_type
  x2 = x.array().derived();

Не приятно: (

Более простое решение - не беспокоиться и создать ArrayWrapper даже для входов, которыеуже находятся в мире массивов:

ArrayWrapper<T> x2(x.derived());

Еще одно простое решение состоит в том, чтобы заставить вызывающую сторону передавать выражения в мире массивов:

template <typename T> void foo(ArrayBase<T> &x) {
  T& x2(x.derived());
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...