【问题标题】:Substitutions for Eigen::MatrixXd typedefsEigen::MatrixXd 类型定义的替换
【发布时间】:2017-07-02 21:23:37
【问题描述】:

用具有long double 元素的向量和矩阵替换所有Eigen::MatrixXds 和Eigen::VectorXds 的最简单方法是什么?

我的代码中的每个基本浮点变量都是long double 类型。此外,每次我使用矩阵或向量时,我都会使用以下 typedef。

typedef Eigen::VectorXd Vec;
typedef Eigen::MatrixXd Mat;

将这些 typedef 切换为最好的方法是什么?如果我让它们保持原样会发生什么?

【问题讨论】:

  • 然而,更重要的问题是,你真的需要long double吗?它可能会显着减慢您的所有计算速度,因为大多数处理器都是为快速执行double 算术而构建的。也可能是您的编译器只是忽略了long double 而使用double。阅读Wikipedia article 并重新考虑。

标签: c++ typedef eigen long-double


【解决方案1】:

只需根据 Eigen 自己的 global matrix typedefs 定义自己的 typedef。

如果您使用Eigen::MatrixXd 并用long double 类型的元素填充它,这些值将缩小以适合矩阵的double 元素,这会导致精度损失,或者在最坏的情况下,溢出错误。然而,在许多架构上,双精度浮点运算是以 80 位扩展精度完成的,因此结果可能相同。你当然不应该依赖这个!如需更多信息,请参阅long double vs double

#include <Eigen/Core>

typedef Eigen::Matrix< long double, Eigen::Dynamic, 1              > Vec;
typedef Eigen::Matrix< long double, Eigen::Dynamic, Eigen::Dynamic > Mat;

int main()
{
  long double ld = 2;

  Mat m(1,1);
  m(0,0) = ld;
}

【讨论】:

  • 谢谢。我看到了那个链接,想知道long double 作为第一个模板参数和`std::complex 之间的区别。我会调查其他事情谢谢
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-08
  • 2015-03-26
  • 1970-01-01
相关资源
最近更新 更多