до него же с другой стороны на 17++?
template <class T>
auto vdotshift(std::vector<T> const &a, std::vector<T> const &b, int s = 0) {
return std::accumulate(
Dter(a.cbegin(), b.cbegin() + s), Dter(a.cend() - s, b.cend()), T{},
[](auto a, auto const &b) { return std::move(a) + b.first * b.second; });
}
хочу, чтобы не нужно было писать - s в a.cend() - s и чтобы парный итератор Dter при любом s проходился по всем элементам вектора a и такому же количеству из b, возвращаясь в начало при достижении b.cend() но не хочу менять Dter
а точно нужно accumulate? https://en.cppreference.com/w/cpp/algorithm/inner_product не пойдет?
да, выглядит как то что нужно, но проблему итерации "с середины" это не решает) return std::inner_product(a.cbegin(), a.cend() - s, b.cbegin() + s, T{});
проблема то где?
проитерироваться по вектору от энного элемента до него же с другой стороны это непонятно что такое ...
Так получи два итератора, начала и конца, и циклом
Итераторы можно через advance получить
чтобы при доступе получилось как то так b.at((i + s) % b.size())
как оказалось, мне нужен адаптер вектора в виде кольцевого буффера))
нужно множество раз проитерироваться алгоритмом по паре векторов, каждый раз сдвигая все элементы одного из них на 1 вправо, без копирования и изменения векторов, все еще не понимаю как это можно сделать без написания враппера
например использовать индексы и operator%
то есть стд алгоритмы отпадают? тот же std::inner_product
Вы бы задачу уточнили. Похоже что-то на задачу (считалку) Иосифа. Так там лучше std::list и обычные циклы.
Скорее похоже на свертку
задача найти множество нормализованных кросс-корреляций двух аудиозаписей для смещений в количестве семплов, сейчас у меня создается вектор и в него копируется одна из дорожек со смещением каждый раз...
ну можно же прокручивать вектор наверное используя std::rotate
да, но он меняет вектор, придется делать копию каждый раз?
Ну так стандартно, через фурье делается такое. Если память не изменяет, на вики написано, как делать. Но если нужно, чтобы считало, как можно дольше, то тут ограничений в фантазиях нет.
странно, но на вики написано что DFT и обратно в случае круговой кросс-корреляции сводятся как раз к тому что я делаю (кольцевые итераторы и std::inner_product). О каком "как можно дольше" тогда речь?
FFT это O(n log(n)) то что вы делаете - O(n^2)
а откуда взялось n^2?
Обсуждают сегодня