Что такое более быстрый способ получить неотрицательную составляющую двойного вектора? То есть,Самый быстрый способ получить неотрицательный компонент
pmax(x, 0)
Моя попытка использования Rcpp:
//' @title Parallel maximum
//' @description A faster \code{pmax()}.
//'
//' @name pmaxC
//' @param x A numeric vector.
//' @param a A single numeric value.
//' @return The parallel maximum of the input values.
//' @note This function will always be faster than \code{pmax(x, a)} when \code{a} is a single value, but can be slower than \code{pmax.int(x, a)} when \code{x} is short. Use this function when comparing a numeric vector with a single value.
//' @export pmaxC
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector pmaxC(NumericVector x, double a) {
int n = x.length();
NumericVector out(n);
for (int i = 0; i < n; ++i) {
double xi = x[i];
if (xi < a) {
out[i] = a;
} else {
out[i] = xi;
}
}
return out;
}
Это скромное улучшение:
set.seed(5)
x <- rnorm(1e6)
microbenchmark(pmax(x, 0), pmaxC(x, 0))
Unit: milliseconds
expr min lq mean median uq max neval cld
pmax(x, 0) 8.500419 8.621341 11.09672 10.132045 10.791020 58.44972 100 a
pmaxC(x, 0) 5.624480 5.709262 8.83968 7.598093 7.907853 53.91339 100 a
Ни неприемлемо медленно, но, учитывая, что общий сценарий, я было интересно, развил ли пакет более быстрый подход.
'х * (х> = 0) 'вариант , Если вектор большой и зависит от доли отрицательных значений, может оказаться полезным быстрый (возможно, частичный) алгоритм сортировки. Однако 'pmax' довольно оптимизирован. Зачем вам нужно что-то быстрее? – Roland
Существует функция сахара в Rcpp для pmax. Я сравнивал это, и для одного значения не было быстрее. Какая потребность в улучшенной скорости? – shayaa
@Roland Нет необходимости, но я часто повторяю эту конкретную функцию. Мне просто интересно, есть ли функция, которая просто проверяет знак, а не значение. – Hugh