Я использую научную библиотеку 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
?
Вы можете получить указатель данных, используя 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()
) ;
Oни государство что GSL реализует std ::valarray модель, я прочитал такое утверждение, как разрешение мне использовать что-то вроде:
gsl_block vec;
/* initialize ... */
std::valarray<double> a(vec.data, vec.size);
/* use std:: galore */