Ускорить функцию знака фреймворка

Я пытаюсь найти супер быстрый способ получить знак каждого значения в векторе. Я надеялся найти функцию в среде ускорения для этого, но не смог ее найти. Вот что он будет делать:

float *inputVector = .... // some audio vector
int length = ...// length of input vector.
float *outputVector = ....// result

for( int i = 0; i<length; i++ )
{
  if( inputVector[i] >= 0 ) outputVector[i] = 1;
  else outputVector[i] = -1;
}

person olynoise    schedule 22.04.2015    source источник
comment
Стандартная математическая функция C/C++ — signbit{f}. Возможно, вам придется применить поправку на отрицательный ноль, но в большинстве случаев этого должно быть достаточно.   -  person njuffa    schedule 22.04.2015


Ответы (1)


Ладно, кажется, я нашел способ...

vvcopysignf() "Копирует массив, устанавливая знак каждого значения на основе второго массива."

Таким образом, одним из методов было бы создание массива единиц, а затем использование этой функции для изменения знака единиц на основе входного массива.

float *ones = ... // a vector filled with 1's
float *input = .... // an input vector
float *output = ... // an output vector
int bufferSize = ... // size of the vectors;

vvcopysignf(output, ones, input, &bufferSize);

//output now is an array of -1s and 1s based the sign of the input.
person olynoise    schedule 22.04.2015
comment
запуск нескольких тестов с помощью dispatch_benchmark - этот метод примерно на 80% быстрее, чем выполнение в цикле, как описано в вопросе. И даже быстрее, чем с помощью signbit(). - person olynoise; 22.04.2015