ここでは、OriginCでGSLを使用する方法を紹介します。
Note: v2.5のGSLソースコードからVisual Studioビルド64ビットDLLを使用するには、次の手順に従います。
|
まず、http://gnuwin32.sourceforge.net/packages/gsl.htmからGSL DLLをダウンロードする必要があります。2つのDLL (libgsl.dllとlibgslcblas.dll)だけが必要で、それらをOrigin Cファイルを保持するのと同じフォルダに置くことができます。例えば、c:\oc\ フォルダに保存します。ダウンロードしたdllを使用する場合、バージョンの問題に注意してください。
Origin Cでlibgsl.dllを使用するには、gsl関数のプロトタイプを提供するヘッダファイルが必要です。必要に応じて、GSLヘッダーファイルから必要なプロトタイプ/定義をコピーして変換できます。たとえば、ocgsl.hという名前を付け、c:\oc\フォルダに作成します。
// dllをロードするとき、正しいバージョンをロードする必要があるので、 // 上の "バージョンの問題" のリンクを確認 #pragma dll(libgsl, header) // これはOCの特別なプラグマで、 // libgsl.dll はこのファイルと同じ場所であることを示すキーワード #define GSL_EXPORT // OCでは、これは不要なので空にする // gsl関数プロトタイプをここで直接検索してコピー可能 GSL_EXPORT double gsl_sf_zeta_int (const int n); GSL_EXPORT int gsl_fit_linear (const double * x, const size_t xstride, const double * y, const size_t ystride, const size_t n, double * c0, double * c1, double * cov00, double * cov01, double * cov11, double * sumsq);
Note: コードに#pragma dll(libgslcblas, header)を記述しないでください。そうしないとコンパイルエラーが発生する可能性があります。 |
以下は、gsl_sf_zeta_int および gsl_fit_linearの呼び出し方法を示す簡単なOCファイルです。
#include <Origin.h> #include "ocgsl.h" // GSLのRiemann Zeta関数を使用したサンプル void gsl_test_zeta_function() { double result1 = gsl_sf_zeta_int(2); double result2 = pi*pi/6; printf("Zeta(2) = %f\n", result1); printf("pi^2/6 = %f\n", result2); } // GSLの線形フィットを使用したサンプル void gsl_test_linear_fit(int npts = 10) { vector vx(npts), vy(npts); const double ds = 2, di = 10; for(int ii=0; ii<npts; ++ii) { vx[ii] = ii; vy[ii] = ii*ds + di + (rand()%100-50)*0.05; } for(ii=0; ii<npts; ++ii) printf("%.2f\t%.2f\n", vx[ii], vy[ii]); double c0, c1, cov00, cov01, cov11, sumsq; gsl_fit_linear(vx, 1, vy, 1, npts, &c0, &c1, &cov00, &cov01, &cov11, &sumsq); printf("Slope=%f, Intercept=%f", c1, c0); }
このサンプルでも、フィット関数内にgsl関数を使用する方法を示しています。
Origin Cは、構造体変数を返す外部関数をサポートしていないので、このようなデータを返す関数はOrigin Cでは使用できません。例えば、
gsl_complex gsl_complex_add (gsl_complex a, gsl_complex b)
データの gsl_complex タイプを返し、gsl_complex は次のように定義されます。
typedef struct { double dat[2]; }gsl_complex;