Могу ли я использовать переменную, определенную Eigen, с функцией adj_difference? - PullRequest
0 голосов
/ 11 июля 2019

Все, спасибо заранее за любые комментарии и советы!

Я определил двойной массив с Eigen-библиотекой C ++, затем я хочу использовать adjing_difference Numeric-library of C ++, я нашелчто я не мог использовать эту функцию для переменной, определенной в Eigen-библиотеке.

Это конфликт между двумя библиотеками?По сути, я хочу использовать функцию LinSpaced для Eigen-библиотеки и функцию holy_difference библиотеки Numeric.Конечно, я предпочитаю хранить Eigen-библиотеку в коде.

//not use Eigen defined variables
double a[] = { 1,3,4,7 }, b[4];
adjacent_difference(a,a+4,b);
for (int i = 0; i < 4; i++)
    cout << b[i] << endl;

//use Eigen defined variables
ArrayXd a1(4), b1(4);
a1 << 1, 3, 4, 7;
adjacent_difference(a1, a1 + 4, b1);
for (int i = 0; i < 4; i++)
    cout << b1[i] << endl;

Сообщение об ошибке показывает, что «ни один экземпляр перегруженной функции не соответствует списку аргументов».

1 Ответ

0 голосов
/ 12 июля 2019

Прежде всего, вы можете легко вычислить смежные различия с помощью встроенной функциональности Eigen, например:

void adjacent_diff_eigen(Eigen::ArrayXf const& A, Eigen::ArrayXf& B)
{
    Eigen::Index n = A.size();
    B.resize(n);
    if(n == 0) return;
    B[0] = A[0];
    B.tail(n-1) = A.tail(n-1) - A.head(n-1);
}

В отличие от подхода std, это также должно быть векторизовано (если только не выровнена векторизация)отключено).

Кроме того, с веткой разработки Eigen вы также можете использовать итераторы, похожие на std, например:

void adjacent_diff_std(Eigen::ArrayXf const& A, Eigen::ArrayXf& B)
{
    B.resizeLike(A);
    std::adjacent_difference(A.begin(), A.end(), B.begin());
}

Для более старых версий Eigen вы можете обойти это путем прямого доступа кданные:

    std::adjacent_difference(A.data(), A.data()+A.size(), B.data());

Live-демо на Godbolt: https://godbolt.org/z/qbkagM

...