问题描述
我正在阅读一些文档,发现 new
和 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,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>;
其中 Type
是 float
(f 后缀),第二维上的 Size
是 Dynamic
。
在这两种情况下,您都在创建相同的东西。因为此 Vector 只是 Matrix with 1 Row 的别名,所以使用您期望矩阵具有的 2 arg 构造函数是合法的。我相信如果您将 1 以外的任何内容作为第一个参数传递,您会收到运行时错误(矩阵构造函数调用 Base::_check_template_params();
,没有深入研究这个,但它似乎是一个运行时参数验证器)。
总而言之:这两种情况似乎都在做同样的事情,但我基于对源代码的分析 - 我对 Eigen 文档没有很好的经验。
,是的,Eigen::RowVectorXf(5)
和 Eigen::RowVectorXf(1,5)
都声明了一个 1x5 行向量。
两个构造函数都没有被弃用。澄清一下,RowVectorXf
只是 Matrix<float,Dynamic>
的 typedef,即具有 1 行的浮点值矩阵。如 the Eigen::Matrix documentation 中所列,Matrix(因此还有 RowVectorXf)具有多个构造函数:
-
Matrix(Index dim)
构造函数生成大小为dim
的行或列向量。对于在编译时不知道具有一行或一列的 Matrix 类型,调用此构造函数是编译错误。 -
Matrix(Index rows,Index cols)
构造函数通过rows
生成大小为cols
的矩阵,并且对任何矩阵类型都有效,包括 RowVectorXf。如您所料,如果为 RowVectorXf 调用这种形式的构造函数,则在运行时会断言rows
为 1。
是的,Matrix(Index dim)
构造函数对 RowVectorXf 更有用。但是在通用代码中可以很方便地使用双参数构造函数。