#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
bycols
и действителен для любого типа матрицы, включая 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. Большое вам спасибо — я так и думал, но приятно услышать подтверждение!