Встроенные вычисления математических выражений в Eigen C ++ - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь преобразовать следующий код 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));

1 Ответ

2 голосов
/ 22 января 2020

Вы используете вычисления с двойной точностью в 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 классе .

...