У меня есть числа c векторов различной длины, и я хочу "стандартизировать" их длину, скажем, до 100, чтобы сделать их сопоставимыми и преобразовать необработанный сигнал в более гладкую версию.
Мне нужен контроль по длине и параметрам «сглаживания», поэтому я использовал функцию get_dct_transform
из пакета syuzhet
.
Однако это не очень эффективно для больших необработанных векторов:
set.seed(123)
sample_space = seq(-2, 2, .01)
a = sample(sample_space, 1000, replace = T)
b = sample(sample_space, 10000, replace = T)
c = sample(sample_space, 100000, replace = T)
system.time(syuzhet::get_dct_transform(raw_values = a, low_pass_size = 5))
# user system elapsed
# 0.020 0.000 0.021
system.time(syuzhet::get_dct_transform(raw_values = b, low_pass_size = 5))
# user system elapsed
# 1.562 0.370 1.937
system.time(syuzhet::get_dct_transform(raw_values = c, low_pass_size = 5))
# user system elapsed
# 152.802 27.118 180.223
Существуют ли более быстрые способы выполнения таких преобразований (DCT или FT) в R?
Другой ответ SO предложил функцию fft
, но мне понадобится прямой контроль над длиной и параметром фильтра. Та же проблема для emuR::dct
.
Я не женат на DCT - другие методы преобразования вектора длины v в «сглаженный» вектор длины n также будет в порядке.