Segfault в умножении транспонированной матрицы с помощью .eval () с библиотекой Eigen 3 - PullRequest
0 голосов
/ 12 сентября 2018

Я добавил два .eval() на всякий случай.Я не получил ни ошибки компиляции, ни предупреждения во время выполнения.Просто segfault.

Спасибо, что помогли мне это исправить.

Тест:

#include <Eigen/Eigen>
#include <iostream>
using namespace Eigen;

int main() {
    Matrix<float, Dynamic, Dynamic> mat_b;
    Matrix<float, Dynamic, Dynamic> mat_c;

    mat_b << 1.0, 0.0, 0.5, 0.5,
             0.0, 1.0, 0.5, 0.5,
             1.0, 0.0, 1.0, 0.0,
             0.0, 1.0, 0.0, 1.0;

    mat_c << 0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
             0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
             1.0, 0.0, 1.0, 0.0, 0.0, 0.0,
             1.0, 0.0, 0.0, 1.0, 0.0, 0.0;

    std::cout << (mat_b.transpose().eval() * mat_c).eval() << "\n";
}

Результат:

Segmentation fault (core dumped)

1 Ответ

0 голосов
/ 12 сентября 2018

Как указано в Documentmentatipon

Инициализатор запятой

Eigen предлагает синтаксис инициализатора запятой, который позволяет пользователю легко установить все коэффициенты матрицы, вектор или массив.Просто перечислите коэффициенты, начиная с верхнего левого угла и двигаясь слева направо и сверху вниз. Размер объекта должен быть указан заранее .Если вы укажете слишком мало или слишком много коэффициентов, Эйген пожалуется.

Акцент мой.Если вы ожидаете, что Matrix ctor будет выводить размер из вашего форматирования, это просто невозможно в C ++.Похоже, вы создали матрицу 16x1 и 24x1, а затем попробуйте умножить 1x16 (транспонированную первую) на 24x1, что недопустимо.

...