Eigen::RowVectorXf 的不同初始化有什么作用?
What do the different Initializations of Eigen::RowVectorXf do?
我正在阅读一些文档,发现 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,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>;
其中 Type
是 float
(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 更有用。但是在泛型代码中可以很方便地使用双参数构造函数。
我正在阅读一些文档,发现 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,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>;
其中 Type
是 float
(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 更有用。但是在泛型代码中可以很方便地使用双参数构造函数。