Eigen::RowVectorXf 的不同初始化有什么作用?

What do the different Initializations of Eigen::RowVectorXf do?

我正在阅读一些文档,发现 newEigen::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 列的一维向量并填充它,我将非常感激。谢谢!

根据我在 Martix.h 中看到的内容,RowVectorXf 是矩阵

的别名

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

其中 Typefloat(f 后缀)并且 Size 在第二个维度上是 Dynamic.

在这两种情况下,您都在创建相同的东西。因为此 Vector 只是 Matrix with 1 Row 的别名,所以使用您期望矩阵具有的 2 arg 构造函数是合法的。我相信如果您将除 1 之外的任何其他内容作为第一个 arg 传递,您会收到运行时错误(矩阵构造函数调用 Base::_check_template_params();,没有深入研究这个,但它似乎是一个运行时参数验证器)。

总结一下:这两种情况似乎都做同样的事情,但我是基于对源代码的分析——我对 Eigen 文档没有很好的经验。

是的,Eigen::RowVectorXf(5)Eigen::RowVectorXf(1, 5) 都声明了一个 1x5 行向量。

两个构造函数都没有被弃用。澄清一下,RowVectorXf 只是 Matrix<float, 1, Dynamic> 的类型定义,即具有 1 行的浮点值矩阵。如 the Eigen::Matrix documentation 中所列,Matrix(因此也是 RowVectorXf)具有多个构造函数:

  • Matrix(Index dim) 构造函数生成大小为 dim 的行或列向量。为编译时不知道有一行或一列的 Matrix 类型调用此构造函数是编译错误。

  • Matrix(Index rows, Index cols) 构造函数通过 cols 生成大小为 rows 的矩阵,并且对任何 Matrix 类型都有效,包括 RowVectorXf。如您所料,如果为 RowVectorXf.

    调用这种形式的构造函数,则在 运行 时间断言 rows 为 1

是的,Matrix(Index dim) 构造函数对 RowVectorXf 更有用。但是在泛型代码中可以很方便地使用双参数构造函数。