【问题标题】:What do the initialized Array constructors do?初始化的 Array 构造函数有什么作用?
【发布时间】:2014-07-01 13:53:31
【问题描述】:

Eigen 文档中,我看到了很多这样的内容:

Array (const Scalar &val0, const Scalar &val1)
Array (const Scalar &val0, const Scalar &val1, const Scalar &val2)
Array (const Scalar &val0, const Scalar &val1, const Scalar &val2, const Scalar &val3)

根据文档 (http://eigen.tuxfamily.org/dox/classEigen_1_1Array.html),这些构造函数“构造一个具有给定系数的初始化 ND 向量”。

这是什么意思?如果我做Array(1,2,3),结果是什么?

具体来说,它在每个维度中放置了哪些系数,以及每个维度中的数组有多大?根据文档,构造函数Array(1,2,3) 应该构造一个 3D 数组,并使用“给定系数”初始化其内容。结果应该如何?

【问题讨论】:

  • 这是第三方库,不是标准库,所以不要指望这里有太多帮助。但是,根据文档,我假设它使用这些值初始化数组。这种代码可能早于初始化列表,这将允许使用单个构造函数完成。
  • Ummm... 是什么阻止您将其写入代码并打印出矩阵?您可以用 10 行代码检查输出。
  • @luk32 编译器错误。
  • 好吧,那么您现在对代码的真正作用就没有问题了。也许尝试按顺序解决问题。
  • @luk32 你想让我尝试修复编译器错误之前我了解代码应该做什么?

标签: c++ eigen


【解决方案1】:

构造函数用于固定大小的数组。假设声明是Eigen::Array3i,那么您提到的构造函数会初始化一个一维 int 数组,其中三个元素初始化为指定的值。

【讨论】:

  • 但是文档特别声明它是用于2D、3D等数组
  • @Jason 我认为对 2D、3D、4D 存在误解。维度不是“物理”维度,而是数组的单个维度的长度。 Eigen::Array 也可以像矩阵一样具有两个“物理”维度,但在上述构造函数中并非如此。
  • 我不认为我跟随。当他们说 4D 向量时,他们的意思是长度为 4 的 1D 向量?
  • 我的下一个问题是为什么他们称它们为向量,而向量总是一维的,但我想这回答了它......
  • @Jason 我不是第一个这么说的人,但是文档就像性:当它好时,它非常非常好;当情况不好时,总比没有好。话虽如此,我与 Eigen 无关,我只是使用它。我发现他们的文档非常好而且很有帮助。
【解决方案2】:

这些构造允许您创建最大为 4 的数组:

Eigen::Array<int, 1, 4> a(1, 2, 3, 4)

如果您尝试使用除N(1-4) x 1 数组之外的任何内容进行这样的初始化,Eigen 将引发编译错误。例如:

Eigen::Array<int, 1, 3> a(1, 2, 3) //Fine
Eigen::Array<int, 3, 1> a(1, 2, 3) //Fine
Eigen::Array<int, 3, 3> a(1, 2, 3) //Compile error

error: ‘THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE

我不会像这样初始化它们。有一个关于 Eigen 初始化 here 的教程,它为如何初始化数组提供了很好的建议,例如:

Eigen::Array33 a;
a << 1, 2, 3, 4 ...

有文档here

或者您可以使用特殊的初始化,例如:

Eigen::ArrayXXf a = Eigen::ArrayXXf::Zero(1, 4) //0, 0, 0, 0

【讨论】:

  • 是的,但a(1,2,3,4) 究竟做了什么?系数是多少?一个 2x2x2x2 矩阵有 16 个系数,但您只提供了 4 个...
  • 等等,你说的数组大小最多为 4。你能更具体一点,这样的数组/矩阵可以有 3 个大小。使用哪个?编辑,嗯,好吧,我看到文档也很模糊。除非真的需要,否则我也不建议使用这种初始化方法。
  • @Jason 抱歉,我不清楚,我已将答案编辑得更清楚。
  • Ben,我认为这可能是一个不同的构造函数,因为您所描述的是一维向量。文档描述了 Array(1,2,3)... 的 3D 向量的构造
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2015-09-04
相关资源
最近更新 更多