4

gnu Scientific Library (GSL) を使用しています。次のようなものがあるgsl_vectorとします: 7 0 -6 5 8 0 10 -2

これは、要素として正の数、負の数、ゼロを含むベクトルです。

this の非ゼロ要素またはゼロ要素の数をカウントしたいgsl_vectorcount_ifC++ ベクトルに対して呼び出される関数があることは知っています。しかし、 and を検索するgsl_vector.hと、それにgsl_blas.h等しい関数はありません。ただし、すべての要素を評価してgsl_vector_get()、if の質問をすることができます。

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 にもっと効率的な関数が既に存在するかどうかについて、ほぼ 1 日疑問に思っていました。

または多分count_if機能がありgsl_arrayますか?

4

2 に答える 2

2

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()
) ;
于 2012-11-27T11:51:25.803 に答える
1

彼らは、GSL が std:: valarray モデルを実装していると述べています。

gsl_block vec;
/* initialize ... */
std::valarray<double> a(vec.data, vec.size);
/* use std:: galore */
于 2012-11-27T11:35:43.493 に答える