массивы — есть ли функция count_if для gsl_vector? C / Переполнение стека

Я использую научную библиотеку GNU (GSL).
Скажи у меня есть gsl_vector как это:
7 0 -6 5 8 0 10 -2

Это вектор, содержащий положительные числа, отрицательные числа и нули в качестве элементов.

Я хочу посчитать количество ненулевых элементов или нулевых элементов в этом gsl_vector,
Я знаю, что есть функция под названием count_if для вектора C ++. Но я ищу через gsl_vector.h а также gsl_blas.h, нет функции, равной этому.
Я могу пройти все элементы, оценивая их, хотя gsl_vector_get() а затем задать вопрос, если.

int counter = 0;

for(int i = 0;i<length_of_the_gsl_vector;++i){
if(fabs(gsl_vector_get(y,i))<0.5) ++counter;
}

return counter;

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

Или, может быть, есть count_if функция для gsl_array ?

4

Решение

Вы можете получить указатель данных, используя gsl_vector_ptrзатем используйте std::count_if по указателям:

struct Predicate{
inline bool operator()(double x) const {
return fabs(x) < 0.5 ;
}
} ;

int res = std::count_if(
gsl_vector_ptr(y,0), gsl_vector_ptr(y,0) + size,
Predicate()
) ;
2

Другие решения

Oни государство что GSL реализует std ::valarray модель, я прочитал такое утверждение, как разрешение мне использовать что-то вроде:

gsl_block vec;
/* initialize ... */
std::valarray<double> a(vec.data, vec.size);
/* use std:: galore */
1