Вы используете вычисления с двойной точностью в Matlab, но с одинарной точностью в Eigen, поэтому неудивительно, что Matlab получит более «точные» результаты. Сравните это со значениями, которые вы получаете от 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));
Возвращаемое значение 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());
Для получения дополнительной информации ознакомьтесь с Документацией Эйгена о Array
классе .