Мы получим точно такой же результат, что и в случае с циклом. Это, вероятно, пример ситуации, когда строгое следование алгоритмам STL не приводит к повышению качества кода. Тем не менее данная реализация алгоритма не знает о выбранной структуре данных. Она также будет работать со списками (однако в нашем случае это не будет иметь особого смысла). Еще одним преимуществом является тот факт, что алгоритмы C++17 STL легко
Еще одна сложная часть — генерация сигналов. Еще раз взглянем на gen_cosine
static auto gen_cosine (size_t period_len)
{
return [period_len, n{0}] () mutable {
return cos(double(n++) * 2.0 * M_PI / period_len);
};
}
Каждый экземпляр лямбда-выражения представляет собой объект функции, который изменяет свое состояние при каждом вызове. Его состояние описывается переменными period_len
signal_from_generator
:template
static auto signal_from_generator(size_t len, F gen)
{
csignal r (len);
generate(begin(r), end(r), gen);
return r;
}
Эта вспомогательная функция выделяет память для вектора сигнала с заданной длиной и вызывает метод std::generate
r
он один раз вызывает объект функции gen
, который представляет собой самоизменяющийся объект функции; его можно создать с помощью gen_cosine
. ranges
Определяем ошибку суммы двух векторов
Существует несколько способов определения численной ошибки между целевым и реальным значениями. Измерение разницы между сигналами, состоящими из множества точек графика, обычно подразумевает использование циклов и вычитание соответствующих точек графика и т.д.
Существует простая формула для определения этой ошибки между сигналами a
b
(рис. 6.5).Для каждого значения i
Как это делается
В этом примере мы создадим два сигнала и посчитаем для них ошибку суммы.
1. Как и обычно, сначала приводим выражения include
std
:#include
#include
#include
#include
#include
#include
using namespace std;
2. Определим ошибку суммы двух сигналов. Таковыми выступят синусоидальная волна и ее копия, только оригинал будет сохранен в векторе, содержащем переменные типа double
int
. Поскольку копирование значения из переменной типа double
в переменную типа int
приводит к потере той его части, что стоит после десятичной точки, мы double
вектор as
, что расшифровывается как int
, — ds
, что значит int main()
{
const size_t sig_len {100};
vector
vector