Eigen :: не может конвертировать Block <Derived>в Ref <Derived>, когда число столбцов фиксировано - PullRequest
0 голосов
/ 02 марта 2019

Я недавно обновился до последней версии Eigen (3.3.90), и похоже, что это сломало то, что я работал раньше (до этого я использовал версию Eigen 3.2.10, поставляемую с библиотекой libigl).

Я хотел бы сохранить результат блока в объекте ref, который будет передан и в конечном итоге использован для обновления внутренних элементов формы матрицы, из которой извлечен блок.

Минимальный пример, который нескомпилируйте больше:

#include <Eigen/Dense>

int main(int argc, char *argv[])
{
  typedef Eigen::Matrix<bool, Eigen::Dynamic, 1> Mtype;
  typedef Eigen::Block<Mtype> Btype;
  typedef Eigen::Ref<Mtype> Rtype;
  Mtype m(2, 1);
  Btype bm = m.block(0, 0, 1, 1);
  Rtype rm = m; // OK
  Rtype rbm = bm; // Visual studio 2017 error C2440: 'initialisation' : impossible conversion
}

Обратите внимание, что версия const работает, я думаю, это связано со специализацией Ref для const, которая воссоздает временную копию:

typedef Eigen::Ref<const Mtype> CRtype;
CRtype crbm = bm; // OK

Аналогично, используяТип матрицы с и числом строк и столбцов Динамический , также компилируется:

typedef Eigen::Matrix<bool, Eigen::Dynamic, Eigen::Dynamic> Mtype;
typedef Eigen::Block<Mtype> Btype;
typedef Eigen::Ref<Mtype> Rtype;
Mtype m(2, 1);
Btype bm = m.block(0, 0, 1, 1);
Rtype rbm = bm;

Любые подсказки?

Большое спасибо!

С уважением,

Джером

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Мой предыдущий ответ был слишком быстр в своем заключении.Теперь это исправлено: https://bitbucket.org/eigen/eigen/commits/cacb7b4ace39/

Тем не менее, все же лучше сохранять вектор времени компиляции в качестве векторов времени компиляции.Эта информация теряется на Block<VectorXd>m.block(0, 0, 1, 0)), потому что она может иметь 1 или 0 столбец во время выполнения, например:

Block<VectorXd> bm = m.block(0, 0, 1, 0);

совершенно нормально.Поэтому в вашем случае я бы по-прежнему рекомендовал сохранить эту информацию, например:

auto bm = m.segment(0,1);
auto bm = m.block(0,0,1,fix<1>);       // fix is new in Eigen 3.4
auto bm = m.block<Dynamic,1>(0,0,1,1); // <3.4 version of the above cleaner line

Это типичная ситуация, когда вам действительно следует использовать auto.Вы также можете напрямую инициализировать Ref, например:

Ref<MType> rm = m.segment(0,1);
0 голосов
/ 03 марта 2019

Eigen version 3.3.90 - это ветка для разработчиков, и там могут быть проблемы.Использование последней стабильной версии (3.3.7) решает эту проблему.При этом вы можете отправить отчет об ошибке разработчикам Eigen, чтобы убедиться, что это замечено (хотя к тому времени, как вы это сделаете, они, вероятно, уже увидели этот пост).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...