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。
我正在尝试将以下 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。