Что делают разные инициализации Eigen::RowVectorXf ?

#c #linear-algebra #eigen #eigen3

#c #линейная алгебра #eigen #eigen3

Вопрос:

Я читаю некоторые документы и нашел две разные инициализации и способы использования new with Eigen::RowVectorXf . Я не мог найти, в чем разница, в документации или даже в том, что это возможно, и надеялся на некоторые разъяснения.

Вот первая версия:

 std::vector<Eigen::RowVectorXf*> V;
std::vector<float> data = {0,1,2,3,4};


V.push_back(new Eigen::RowVectorXf(5));

for (int i = 0; i<5; i  )
     V[0]->coeffRef(1, i) = data[i];

 

Вот вторая версия:

 std::vector<Eigen::RowVectorXf*> V;
std::vector<float> data = {0,1,2,3,4};


V.push_back(new Eigen::RowVectorXf(1, 5));

for (int i = 0; i<5; i  )
     V[0]->coeffRef(i) = data[i];

 

Я не смог найти никаких ссылок на это в документации, и я не верю, что они должны быть разными — это просто устаревшая функция доступа? Если бы кто-нибудь мог дать мне общее представление о том, что должно происходить в обоих случаях математически, и дайте мне знать, если оба они просто создают одномерный вектор с 5 столбцами и заполняют его, я был бы очень благодарен. Спасибо!

Ответ №1:

Да, Eigen::RowVectorXf(5) и Eigen::RowVectorXf(1, 5) оба объявляют вектор строк размером 1×5.

Ни один из конструкторов не является устаревшим. Чтобы уточнить, RowVectorXf это просто typedef для Matrix<float, 1, Dynamic> , то есть матрицы с плавающей запятой с 1 строкой. Как указано в документации Eigen::Matrix, Matrix (и, следовательно, также RowVectorXf) имеет несколько конструкторов:

  • Matrix(Index dim) Конструктор создает вектор размера строки или столбца dim . Вызов этого конструктора для матричного типа, который, как известно, не имеет одной строки или одного столбца во время компиляции, является ошибкой компиляции.
  • Matrix(Index rows, Index cols) Конструктор создает матрицу размера rows by cols и действителен для любого типа матрицы, включая RowVectorXf . Как и следовало ожидать, во время выполнения есть утверждение rows , равное 1, если вызвать эту форму конструктора для RowVectorXf.

Да, Matrix(Index dim) конструктор более полезен для RowVectorXf. Но в общем коде может быть удобно, что всегда можно использовать конструктор с двумя аргументами.

Комментарии:

1. Большое вам спасибо — я так и думал, но приятно услышать подтверждение!

Ответ №2:

Основываясь на том, что я вижу в Martix.h , RowVectorXf это псевдоним для матрицы

using RowVector##SizeSuffix = Matrix<Type, 1, Size>;

Где Type float (f sufix) и Size во 2-м измерении Dynamic .

В обоих случаях вы создаете одно и то же. Поскольку этот вектор является просто псевдонимом для матрицы с 1 строкой, законно использовать конструктор 2 arg, который, как вы ожидаете, будет иметь матрица. Я полагаю, что если бы вы передали что-либо, отличное от 1, в качестве первого аргумента, вы бы получили ошибку времени выполнения (вызовы конструктора матрицы Base::_check_template_params(); , не копались в этом, но, похоже, это средство проверки параметров времени выполнения).

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

Комментарии:

1. Большое вам спасибо — я так и думал, но приятно услышать подтверждение!