Проблема с инициализацией запятой в Eigen С++

У меня возникла проблема, когда инициализация запятой, указанная в руководстве по Eigen здесь, не работать.

У меня есть система, в которой у меня есть основной раздел, в котором инициализируется вектор:

Главный:

VectorXd v;

и функция:

double useVector(VectorXd &v) {
    dataI = model_.find();
    v << model_[dataI].v[0], model_[dataI].v[1], model_[dataI].v[2], 1;
    return dataI;
}

примечание: функция используется следующим образом:

double distance = useVector(v);

Теперь model_[dataI].v превратился в double[3], и он определенно работает. Я так понимаю, что это то же самое, что и это:

VectorXd v;
v << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;

но это не работает, код с ошибкой сегмента на этапе инициализации запятой в функции.

ПРИМЕЧАНИЕ: это работает, хотя:

v.resize(4)
v[0] = model_[dataI].v[0];
v[1] = model_[dataI].v[1];
v[2] = model_[dataI].v[2];
v[3] = 1;

пока v инициализируется следующим образом:

VectorXd v(4);

что сразу же заставляет меня задуматься о точке изменения размера (но если я ее уберу, снова произойдет ошибка сегментации).

Кто-нибудь знает, почему это происходит?


person Fantastic Mr Fox    schedule 07.01.2013    source источник


Ответы (1)


Да, размер вектора v должен быть изменен до соответствующего размера перед использованием инициализатора запятой.

person ggael    schedule 07.01.2013
comment
Какой смысл использовать VectorXd, если вам нужно изменить размер вектора вручную? Я думал, Эйген должен справиться с этим. - person Shivanand; 17.12.2018
comment
Причины двоякие. Во-первых, мы не делаем различий между VectorXd и MatrixXd (оба являются Matrix<...>), а в последнем нам действительно нужно знать размеры, чтобы правильно расположить заданные записи. Во-вторых, это позволяет напрямую вставлять элементы в целевое VectorXd без необходимости постоянного перераспределения. - person ggael; 19.12.2018