Предположим, у меня есть вектор vec
длинной (, начинающийся с 1E8 элементов. )и хотел бы ограничить его диапазоном [a,b]
. Я, конечно, могу закодировать vec[vec < a] = a
и vec[vec > b] = b
, но это требует двух проходов по данным и большого выделения ОЗУ для вектора временного индикатора (~800 МБ, дважды ). Два прохода сжигают время, потому что мы можем добиться большего успеха, если будем копировать данные из основной памяти в локальный кеш только после того, как (обращения к основной памяти будут неверными, как и промахи кеша ). И кто знает, насколько это можно улучшить с помощью нескольких потоков, но не будем жадничать.:)
Есть ли хорошая реализация в базе R или каком-то пакете, который я упускаю из виду, или это работа для Rcpp (или моего старого друга data.table
)?