Eigen::RowVectorXf的不同初始化做什么?



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

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

这两个构造函数都不推荐使用。为了澄清,RowVectorXf只是Matrix<float, 1, Dynamic>的一个类型定义,也就是说,一个只有一行的浮点矩阵。如Eigen::Matrix文档中所列,Matrix(因此也包括RowVectorXf)有多个构造函数:

  • Matrix(Index dim)构造函数创建大小为dim的行或列向量。对于在编译时不知道只有一行或一列的Matrix类型调用此构造函数会导致编译错误。

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

是的,Matrix(Index dim)构造函数对于RowVectorXf更有用。但是在泛型代码中,总是使用两个参数的构造函数是很方便的。

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

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

其中Typefloat(f后缀),SizeDynamic

在这两种情况下,您创建了相同的东西。因为这个向量只是一个有一行的矩阵的别名,所以使用2个参数的构造函数是合法的,你会期望一个矩阵有。我相信如果你传递的第一个参数不是1,你会得到一个运行时错误(矩阵构造函数调用Base::_check_template_params();,没有深入研究这个,但它似乎是一个运行时参数验证器)。

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

相关内容

  • 没有找到相关文章

最新更新