Eigen C++ 中数学表达式的内联计算

Inline Computation of Math Expressions in Eigen C++

我正在尝试将以下 MATLAB 代码转换为 Eigen C++。

MATLAB:

yMATLAB = sin(2*pi*100*(0:N-1));

Eigen C++

Eigen::VectorXf t = Eigen::VectorXf::LinSpaced(N, 0.0, N - 1.0);
Eigen::VectorXf t1 = 2.0 * EIGEN_PI * 100.0 * t;
Eigen::VectorXf yEigen = t1.array().sin();
std::cout << yEigen;

但是,我在 yEigen 中得到的值不正确。你能告诉我我的 Eigen 代码的哪一部分不正确吗?

我的第二个问题是,我可以为这个计算使用内联数学表达式,类似于仅在一行中完成所有操作的 MATLAB 语句吗?没有定义临时变量的类似下面的东西(我知道这不会编译):

Eigen::VectorXf y = 
    Eigen::sin(2.0 * EIGEN_PI * 100.0 * Eigen::VectorXf::LinSpaced(N, 0.0, N - 1.0));

您在 Matlab 中使用双精度计算,但在 Eigen 中使用单精度计算,因此 Matlab 不出所料地会获得更多 "accurate" 结果。 将此与您从 Eigen 获得的值进行比较:

yMATLAB = sin(single(2*pi*100*(0:N-1)));

要将表达式写在一行中,我建议首先使用 Array 而不是 Vector —— 特别是如果您将主要进行元素方面的数学运算:

Eigen::ArrayXf y = Eigen::sin(2.0 * EIGEN_PI * 100.0 *
                            Eigen::ArrayXf::LinSpaced(N, 0.0, N - 1.0));

如果您愿意,return 值 y 也可以是 VectorXf。 仅供参考 ArrayXd 而不是 ArrayXf (这应该与 Matlab 计算的几乎相同):https://godbolt.org/z/Qn69ru

如果出于某种原因你想写 VectorXf::LinSpaced,你需要在你想取正弦的表达式周围放置一个 (...).array(),例如:

Eigen::VectorXf y = 
    Eigen::sin(
        (2.0 * EIGEN_PI * 100.0 * 
                Eigen::VectorXf::LinSpaced(N, 0.0, N - 1.0)
        ).array());

有关详细信息,请查看 Eigen's documentation about the Array class