繁体   English   中英

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 on 2nd 维度是Dynamic

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

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

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

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

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

  • Matrix(Index rows, Index cols)构造函数通过cols创建一个大小为rows的矩阵,并且对任何 Matrix 类型都有效,包括 RowVectorXf。 如您所料,如果为 RowVectorXf 调用这种形式的构造函数,则在运行时会断言rows为 1。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM