読者です 読者をやめる 読者になる 読者になる

opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

GSLのcombinationをかじってみた

GSLを使ってみたメモ。こういうの楽しいよね。

GNUのScientific Libraryなる数学?とかのライブラリがあるそうな。
こういうのを見ると面白そうだなとは思うけど大抵理解できない。 まあでもさすがにcombinationくらいはわかるかなと思って使ってみた。と言ってもexampleをなんだけど。

macでもビルドできたけど、archlinuxのpacmanから入れるのが速かったのでpacmanで入れてサーバーでコードを書いて実行してみた。
なんとなくC++で呼び出してるけどGSLはCのライブラリなのでCで使うのが無難かな。C++でも使えたけど。

/*
コンパイルするときのコマンドは以下。とりあえず参考までに
g++ -Wall -I/usr/include  main.cpp -lgsl -lgslcblas -o a.out
*/


//このへんのincludeは別に要らない。なんとなく書いただけなので気にしない
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>

//gsl
#include<gsl/gsl_math.h>
#include<gsl/gsl_combination.h> //多分こっちだけでおkなんだけど

using namespace std;

int main(int argc,char* argv[]){

       gsl_combination * c; //combinationの構造体を定義
       size_t i;

       for (i = 0; i <= 10; i++) // 0...10の範囲での取り出し方をそれぞれループして表示する
         {
           /*gsl_combination_calloc関数については下に詳しくメモしてあるよ*/
           c = gsl_combination_calloc (10, i);//10個あるものからi個取り出す
           do
             {
               printf ("{");
               gsl_combination_fprintf (stdout, c, " %u");
               printf (" }\n");
             }
           while (gsl_combination_next (c) == GSL_SUCCESS);//次があればループ
           gsl_combination_free (c);//メモリ解放
         }

       return 0;
}

10個あるものから0個、1個、2個....10個と取り出すパターンを順番に表示できるプログラムみたい。
ほとんどDocumentのexampleのコピーなんだけど。

まあ、どういう挙動かはコメントに書いてる。若干間違いがあるかもわからんが。


尚、combination構造体の初期化関数には以下の2つがある

gsl_combination * gsl_combination_alloc (size_t n, size_t k)

gsl_combination * gsl_combination_calloc (size_t n, size_t k)

おいらの翻訳が間違えてなかったら、両者の違いはcombinationを初期化するか初期化しないかということ。
上の例でも*_callocの方を使ってるがcallocの方を使えば構造体のメモリ割り当てを行った後更に辞書順にしたがって一番最初にくるcombinationの組み合わせで初期化してくれるようだ。
だから上の例ではこの関数を読んでc変数を初期化した後すぐdoの中でprintfしても大丈夫なんだと思う。

で、組み合わせの初期化無しのgsl_combination_alloc関数を読んだ場合だと以下の関数を呼ぶことでcallocの方で行われる処理と同様に初期化できるようだ

void gsl_combination_init_first (gsl_combination * c)

詳しいドキュメントは以下。combinationのところはそんなに多くないから少しやれば完璧に理解できるかも。
http://www.gnu.org/software/gsl/manual/html_node/Combinations.html



今後もGSLとか暇な時にいろいろ遊んで覚えたい気がする。

Firefox ブラウザ無料ダウンロード