【问题标题】:Can I have Eigen::VectorXd with size larger than the size limit (2^32)?我可以让 Eigen::VectorXd 的大小大于大小限制 (2^32) 吗?
【发布时间】:2019-11-24 20:47:45
【问题描述】:

我正在尝试初始化一个大小为 60,000,000,000 的 VectorXd。运行我的软件时,由于矢量大小,我收到以下错误。

有解决问题的建议吗?

a.out: /usr/local/EasyBuild/software/Eigen/3.3.3-intel-2018a/include/Eigen/src/Core/PlainObjectBase.h:312: void Eigen::PlainObjectBase::resize(Eigen ::Index) [with Derived = Eigen::Matrix; Eigen::Index = long int]: 断言 `((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size=0' 失败。 中止(核心转储)

【问题讨论】:

  • 您有 450GB 的连续可用 RAM 吗?如果是稀疏数据,应该使用稀疏数据结构
  • “有什么建议可以解决这个问题吗?” 我的建议是过度考虑你的程序逻辑,因为通常人们不需要包含 600 亿个元素的向量。你想做什么?如果您发布您的代码并描述您想用它解决的问题,也许我们可以推荐一个更好的方法。
  • 除非您有足够的内存,否则这只会导致错误分配:godbolt.org/z/KoNMjE。如果你得到上面的断言,你正在做一些奇怪的事情。发布minimal reproducible example!
  • 感谢大家的帮助。实际上,这 600 亿个元素是来自一个巨大的稀疏矩阵的非零元素。我想我会将它们保存在一个矩阵中,然后从其他矩阵中访问它们的行和列。

标签: c++ eigen


【解决方案1】:

Core/util/Constants.h 中将“Dynamic”值定义为

//Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.
const int Dynamic = -1;

因此,您可以通过将其重新定义为更大的类型来摆脱特定的断言,例如

const long Dynamic = -1;

但是,模板参数在 Eigen 中被指定为 int,因此您可能需要在很多地方更改它。另外,您应该注意上面的评论。您需要确保使用相同的修补 Eigen 版本编译链接的所有内容。

此外,您将需要不合理数量的 RAM 或交换空间才能使该程序运行。

【讨论】:

  • 只要SizeAtCompileTime == Dynamic && MaxSizeAtCompileTime==Dynamic 为真(VectorXd 就是这种情况),就不应该触发上面的断言。无需为此在 Eigen 内部进行修补。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2016-04-16
  • 2021-07-11
  • 2022-07-21
  • 2014-10-28
相关资源
最近更新 更多