Yamamoto's Laboratory
設定

インストールの方法

私のメイン PC の動作環境は,Ubuntu 14.04 です.プログラム開発は,それで GCC を使っています.このような環境でALGLIB を使うため,以下のように設定しました.

  1. ALGLIBALGLIB Free Edition の C++ 版の最新の zip ファイル (2015年11月6の最新: alglib-3.10.0.cpp.gpl.zip)をダウンロードします.
  2. ダウンロードしたディレクトリーに移動し,ファイルを解凍します.
    $ unzip alglib-3.10.0.cpp.gpl.zip
    すると,以下のファイル/ディレクトリーが作成されます.
    gpl2.txt GNU GENERAL PUBLIC LICENSEVersion 2, June 1991
    gpl3.txt GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
    manual.cpp.html ALGLIB のマニュアル
    src ALGLIB のソースファイルが保管されているディレクトリー
    tests ALGLIB のテストファイルが保管されているディレクトリー
  3. コマンド「cd cpp/src」で,ALGLIB のソースファイルが保管されているディレクトリーに移動します.
  4. ディレクトリー「src」の中には,たくさんの C++ のソースファイル「*.cpp」とヘッダーファイル「*.h」があります.このうち,ヘッダーファイルのみディレクトリー「/usr/local/include/alglib/」にコピーします.コンパイルの時に,ヘッダーファイルのディレクトリーを指定できますので,どこに置いても実害はありません.
    $ sudo mkdir /usr/local/include/alglib
    $ sudo cp *.h /usr/local/include/alglib
    次に,ソースファイル(*.cpp)を「/usr/local/src/alglib/」にコピーします.
    $ sudo mkdir /usr/local/src/alglib
    $ sudo cp *.cpp /usr/local/src/alglib

以上で,インストールというか設定は終わりです.

ALGLIBを使う

ALGLIB はライブラリーの形で配布されていませんので,リンカーでリンクしません.ALGLIB のC++のソースファイル(先の例:/usr/local/src/alglib/*.cpp)とユーザー作成のファイルをコンパイルして,オブジェクトファイルをリンクします.

サンプルプログラム

ダウンロードしたファイルを解凍するとマニュアルが現れます.そのマニュアル(manual.cpp.html)に含まれている「fft_real_d1 example」を例に,コンパイルと実行方法示します.

ソースファイル

プログラムリストを以下に示します.このプログラム(Real FFT: simple example)は,データ列 (1, 1, 1, 1)をフーリエ変換,その結果を逆変換します.

fft_real_d1.cpp

001   #include "stdafx.h"
002   #include <stdlib.h>
003   #include <stdio.h>
004   #include <math.h>
005   #include "fasttransforms.h"
006   
007   using namespace alglib;
008   
009   
010   int main(int argc, char **argv)
011   {
012       //
013       // first we demonstrate forward FFT:
014       // [1,1,1,1] is converted to [4, 0, 0, 0]
015       //
016       real_1d_array x = "[1,1,1,1]";
017       complex_1d_array f;
018       real_1d_array x2;
019       fftr1d(x, f);
020       printf("%s\n", f.tostring(3).c_str()); // EXPECTED: [4,0,0,0]
021   
022       //
023       // now we convert [4, 0, 0, 0] back to [1,1,1,1]
024       // with backward FFT
025       //
026       fftr1dinv(f, x2);
027       printf("%s\n", x2.tostring(3).c_str()); // EXPECTED: [1,1,1,1]
028       return 0;
029   }

まずは,このプログラムをコピーし,「fft_real_d1.cpp」というファイル名で保存します.このプログラムが,ALGLIB をつかったユーザーが作成するプログラムの例になっています.ALGLIB をつかうと,FFT の処理をするプログラムはたったこれだけで記述できます.

リンクするALGLIB ファイル

次にこのプログラムをコンパイル/リンクするために必要な ALGLIB のソースファイルを捜します.これがかなり面倒だ作業です.通常はマニュアルの「8 ALGLIB packages and subpackages」から使う ALGLIB のソースファイルを見つけ,それからインクルードするファイルを探します.深い階層でインクルードされていると探すのがかなり面倒になります.コンパイル/リンク作業でエラーが出たら,その情報から必要なファイルを探すことも可能と思われます.

具体的な例として,先に示したリスト1の「fft_real_d1.cpp」がリンクすべき ALGLIB ファイルを探します.

  1. このプログラム(fft_real_d1.cpp)のヘッダーを確認します.すると,「#include "stdafx.h"」と「#include "fasttransforms.h"」から,ALGLIB の二つのヘッダーがインクルードされることが分かります.
    • 前者(stdafx.h)に対応する C++ のファイルはありません.理由は不明ですが,このヘッダーファイルは空ファイルです.
    • 後者(fasttransforms.h)は,「fasttransforms.cpp」に対応します.
  2. ALGLIB のヘッダーファイルのディレクトリー(/usr/local/include/alglib/)に保管した「fasttransforms.h」がインクルードするヘッダーファイルを確認します.すると,「stdafx.h」と「fasttransforms.h」が必要であることが分かります.これは,元のソースファイル(fft_real_d1.cpp)がインクルードするヘッダーファイルと同一なので,これ以上調べる必要がありません.
  3. ALGLIB のソースファイルのディレクトリー(/usr/local/src/alglib/)に保管した「fasttransforms.cpp」を調べます.すると,「ap.h」と「alglibinternal.h」がインクルードされることが分かります.
    • 前者(ap.h)に対応する C++ のファイルは,「ap.cpp」です.
    • 後者(alglibinternal.h)は,「alglibinternal.cpp」に対応します.
  4. 「ap.cpp」がインクルードするヘッダーファイルを調べます.すると,「stdafx.h」と「ap.h」がインクルードされることが分かります.これらはすでに調査済みです.
  5. 「alglibinternal.cpp」がインクルードするヘッダーファイルを調べます.すると,「stdafx.h」と「alglibinternal.h」がインクルードされることが分かります.これらはすでに調査済みです.

以上の探索により,「fft_real_d1.cpp」から実行ファイルを作成するためには,「fasttransforms.cpp」と「ap.cpp」,「alglibinternal.cpp」をリンクする必要があることが分かります.

マニュアルに書かれている実行ファイル作成

リンクすべき ALGLIB ファイルが分かったので,コンパイル/リンクを実行し,実行ファイルを作成します.マニュアルに書かれているコンパイル方法は,次の通りです.

  1. ユーザープログラム中に,使用するALGLIBの機能のヘッダーファイルをインクルードします.
  2. 必要な ALGLIB のソースファイル(*.cpp)を,ユーザープログラムが保管されているディレクトリー(ワーキングディレクトリー)に,コピーします.
  3. すべてのソースファイル(ユーザーの *.cppと ALGLIB の *.cpp)をコンパイル,リンクしします.

さきのプログラム「fft_real_d1.cpp」であれば,「fasttransforms.cpp」と「ap.cpp」,「alglibinternal.cpp」をワーキングディレクトリーにコピーします.

$ cp /usr/local/src/alglib/fasttransforms.cpp .
$ cp /usr/local/src/alglib/ap.cpp .
$ cp /usr/local/src/alglib/alglibinternal.cpp .

次に,すべてのソースファイルをコンパイルします.

$ g++  -c  fft_real_d1.cpp  -I/usr/local/include/alglib
$ g++  -c  fasttransforms.cpp  -I/usr/local/include/alglib
$ g++  -c  ap.cpp  -I/usr/local/include/alglib
$ g++  -c  alglibinternal.cpp  -I/usr/local/include/alglib

すると,4つのオブジェクトファイル「fft_real_d1.o」と「fasttransforms.o」,「ap.o」,「alglibinternal.o」ができあがります.これらをリンクして実行ファイルを作成します.

$ g++  -o  FFT  fft_real_d1.o  fasttransforms.o  ap.o  alglibinternal.o

すると,実行ファイル「FFT」ができあがります.実行方法とその解釈は,このページのちょっと下にある実行に示します.

Makefile を使った実行ファイルの作成

先に示した方法でのコンパイル・リンクの作業は,かなり面倒です,Makefile を使いこれらの作業の手間を省きます,リスト2に Make file の例を示します.この 「Makefile」とユーザーのソースファイル「fft_real_d1.cpp」を同じディレクトリーに入れます.ALGLIB のソースファイル「fasttransforms.cpp」と「ap.cpp」,「alglibinternal.cpp」は,コピーする必要はありません.そして,次のコマンドを実行します.

$ make

オプション「-Wall」をつけたので,いくつかの警告(Warning)が出ますが,無視ししても問題ないです,このコマンドにより,実行ファイル「FFT」ができあがります.実行方法とその解釈は,次節の実行に示します.

fft_real_d1.cpp のMakefile

001   #-------------- basic settings ---------------
002   TARGET = FFT
003   CFLAGS = -Wall
004   CC = g++
005   INCLUDE = -I/usr/local/include/alglib
006   SRCDIR  = /usr/local/src/alglib/
007   
008   #-------------- compile and link ---------------
009   $(TARGET):Makefile fft_real_d1.o fasttransforms.o ap.o alglibinternal.o
010       $(CC) $(CFLAGS) -o $(TARGET) ap.o fasttransforms.o fft_real_d1.o alglibinternal.o
011   
012   fft_real_d1.o:Makefile fft_real_d1.cpp
013       $(CC) $(CFLAGS) -O3 -c  -o $@ $*.cpp $(INCLUDE)
014   
015   fasttransforms.o:Makefile $(SRCDIR)fasttransforms.cpp
016       $(CC) $(CFLAGS) -O3 -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
017   
018   ap.o:Makefile $(SRCDIR)ap.cpp
019       $(CC) $(CFLAGS) -O3 -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
020   
021   alglibinternal.o:Makefile $(SRCDIR)alglibinternal.cpp
022       $(CC) $(CFLAGS) -O3 -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
023   
024   #-------------- others ------------------------
025   .PHONY: clean
026   clean:
027       rm *.o
028       rm $(TARGET)

実行

コンパイル・リンクで作成された実行ファイル「FFT」は,

$ ./FFT

で実行できます.以下に実行結果を示します.

$ ./FFT
[4.000,0,0,0]
[1.000,1.000,1.000,1.000]

この結果は,次のように解釈します.

  • リスト1のプログラム中に書かれているデータ [1, 1, 1, 1] の FFT の結果が,[4.000, 0, 0, 0] です.
  • FFT の結果 [4.000,0,0,0] を逆 FFT した結果が,[1.000, 1.000, 1.000, 1.000] です.

この結果を見ると,正しく計算されていることが分かります.

テストファイルのコンパイルと実行

ダウンロードした alglib-3.10.0.cpp.gpl.zip には,二つのテストファイルが含まれます.これを解凍すると,ディレクトリー「cpp/tests/」に,三つのファイル「test_c.cpp」と「test_i.cpp」,「test_x.cpp」ができます.このうち最初の二つがテストファイルです.最後の「test_x.cpp」は用途が不明で,私の環境ではコンパイルもできません.

計算テスト(test_c.cpp)

計算テストのプログラムは,「tests/test_c.cpp」です.アルゴズムやストレス,自動適にに生成される大規模な問題のテストを行います.実行時間はかなり必要で,私の環境ではプログラムの終了まで 483秒かかりました.

リスト3に,計算テスト「tests/test_c.cpp」の Makefile を示します.

test_c.cpp のMakefile

001   #-------------- basic settings ---------------
002   TARGET = comp_test
003   CFLAGS = -Wall -O3
004   CC = g++
005   INCLUDE = -I/usr/local/include/alglib
006   SRCDIR  = /usr/local/src/alglib/
007   
008   #-------------- compile and link ---------------
009   $(TARGET): Makefile test_c.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o
010       $(CC) $(CFLAGS) -o $(TARGET) test_c.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o
011   
012   test_c.o: Makefile test_c.cpp
013       $(CC) $(CFLAGS) -c  -o $@ $*.cpp $(INCLUDE)
014   
015   alglibinternal.o: Makefile $(SRCDIR)alglibinternal.cpp
016       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
017   
018   alglibmisc.o: Makefile $(SRCDIR)alglibmisc.cpp
019       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
020   
021   ap.o: Makefile $(SRCDIR)ap.cpp
022       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
023   
024   dataanalysis.o: Makefile $(SRCDIR)dataanalysis.cpp
025       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
026   
027   diffequations.o: Makefile $(SRCDIR)diffequations.cpp
028       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
029   
030   fasttransforms.o: Makefile $(SRCDIR)fasttransforms.cpp
031       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
032   
033   integration.o: Makefile $(SRCDIR)integration.cpp
034       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
035   
036   interpolation.o: Makefile $(SRCDIR)interpolation.cpp
037       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
038   
039   linalg.o: Makefile $(SRCDIR)linalg.cpp
040       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
041   
042   optimization.o: Makefile $(SRCDIR)optimization.cpp
043       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
044   
045   solvers.o: Makefile $(SRCDIR)solvers.cpp
046       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
047   
048   specialfunctions.o: Makefile $(SRCDIR)specialfunctions.cpp
049       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
050   
051   statistics.o: Makefile $(SRCDIR)statistics.cpp
052       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
053   
054   
055   #-------------- others ------------------------
056   .PHONY: clean
057   clean:
058       rm *.o
059       rm $(TARGET)

実行コマンド「./comp_test」と結果は,以下のとおりです.

$ ./comp_test
SEED: 1448066095
COMPILER: GCC
HARDWARE: 32-bit
HARDWARE: little-endian
CPU:   unknown
CORES: 1 (serial version)
LIBS:  
CPUID: 
OS: unknown
TESTING MODE: single core
hqrnd                            OK
tsort                            OK
nearestneighbor                  OK
ablas                            OK
basestat                         OK
bdss                             OK
blas                             OK
clustering                       OK
dforest                          OK
gammafunc                        OK
hblas                            OK
reflections                      OK
creflections                     OK
sblas                            OK
ortfac                           OK
bdsvd                            OK
svd                              OK
linreg                           OK
filters                          OK
evd                              OK
matgen                           OK
sparse                           OK
trfac                            OK
trlinsolve                       OK
safesolve                        OK
rcond                            OK
matinv                           OK
lda                              OK
mlpbase                          OK
xblas                            OK
densesolver                      OK
optserv                          OK
fbls                             OK
cqmodels                         OK
snnls                            OK
sactivesets                      OK
linmin                           OK
mincg                            OK
minbleic                         OK
mcpd                             OK
mlpe                             OK
minlbfgs                         OK
mlptrain                         OK
pca                              OK
odesolver                        OK
fft                              OK
conv                             OK
corr                             OK
fht                              OK
gq                               OK
gkq                              OK
autogk                           OK
idwint                           OK
ratint                           OK
polint                           OK
spline1d                         OK
normestimator                    OK
minqp                            OK
minlm                            OK
lsfit                            OK
parametric                       OK
linlsqr                          OK
rbf                              OK
spline2d                         OK
spline3d                         OK
spdgevd                          OK
inverseupdate                    OK
schur                            OK
minnlc                           OK
minns                            OK
lincg                            OK
nleq                             OK
polynomialsolver                 OK
chebyshev                        OK
hermite                          OK
laguerre                         OK
legendre                         OK
stest                            OK
studentttests                    OK
alglibbasics                     OK
Done in 483 seconds

インターフェーステスト(test_i.cpp)

インターフェーステストのプログラムは,「tests/test_i.cpp」です.リスト4に,の Makefile を示します.このテストは,(1)呼び出し側と計算コアとのデータの受け渡し,(2)入力に関すること,(3)ALGLIBのコンパイル — のテストを行います.

test_i.cpp のMakefile

001   #-------------- basic settings ---------------
002   TARGET = test_i
003   CFLAGS = -Wall
004   CC = g++
005   INCLUDE = -I/usr/local/include/alglib
006   SRCDIR  = /usr/local/src/alglib/
007   
008   #-------------- compile and link ---------------
009   $(TARGET): Makefile test_i.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o
010       $(CC) $(CFLAGS) -o $(TARGET) test_i.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o
011   
012   test_i.o: Makefile test_i.cpp
013       $(CC) $(CFLAGS) -c  -o $@ $*.cpp $(INCLUDE)
014   
015   alglibinternal.o: Makefile $(SRCDIR)alglibinternal.cpp
016       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
017   
018   alglibmisc.o: Makefile $(SRCDIR)alglibmisc.cpp
019       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
020   
021   ap.o: Makefile $(SRCDIR)ap.cpp
022       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
023   
024   dataanalysis.o: Makefile $(SRCDIR)dataanalysis.cpp
025       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
026   
027   diffequations.o: Makefile $(SRCDIR)diffequations.cpp
028       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
029   
030   fasttransforms.o: Makefile $(SRCDIR)fasttransforms.cpp
031       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
032   
033   integration.o: Makefile $(SRCDIR)integration.cpp
034       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
035   
036   interpolation.o: Makefile $(SRCDIR)interpolation.cpp
037       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
038   
039   linalg.o: Makefile $(SRCDIR)linalg.cpp
040       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
041   
042   optimization.o: Makefile $(SRCDIR)optimization.cpp
043       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
044   
045   solvers.o: Makefile $(SRCDIR)solvers.cpp
046       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
047   
048   specialfunctions.o: Makefile $(SRCDIR)specialfunctions.cpp
049       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
050   
051   statistics.o: Makefile $(SRCDIR)statistics.cpp
052       $(CC) $(CFLAGS) -c  -o $@ $(SRCDIR)$*.cpp $(INCLUDE)
053   
054   
055   #-------------- others ------------------------
056   .PHONY: clean
057   clean:
058       rm *.o
059       rm $(TARGET)

実行コマンド「./test_i」と結果は,以下のとおりです.異常を示すメッセージが現れなかったので,これが正常動作と思われます.

$ ./test_i
C++ tests. Please wait...
0/145
50/145
100/145
145/145

ライブラリー化

ライブラリーの作成

ダウンロードしたファイル alglib-3.10.0.cpp.gpl.zip を解凍した出来上がったディレクトリー cpp/src/ に移動します.以下の Makefile を使えば,容易にライブラリーを作成できます.

ALGLIB の静的ライブラリー作成の Makefile

001   #-------------- basic settings ---------------
002   TARGET = libalglib.a
003   CFLAGS = -Wall -O3
004   CC = g++
005   
006   
007   #-------------- compile and make library ---------------
008   $(TARGET):alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o Makefile
009        ar rcs $(TARGET) alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o
010   
011   alglibinternal.o:alglibinternal.cpp alglibinternal.h
012        $(CC) $(CFLAGS) -c -o $@ $*.cpp
013   
014   alglibmisc.o:alglibmisc.cpp alglibmisc.h
015        $(CC) $(CFLAGS) -c -o $@ $*.cpp
016   
017   ap.o:ap.cpp ap.h
018        $(CC) $(CFLAGS) -c -o $@ $*.cpp
019   
020   dataanalysis.o:dataanalysis.cpp dataanalysis.h
021        $(CC) $(CFLAGS) -c -o $@ $*.cpp
022   
023   diffequations.o:diffequations.cpp diffequations.h
024        $(CC) $(CFLAGS) -c -o $@ $*.cpp
025   
026   fasttransforms.o:fasttransforms.cpp fasttransforms.h
027        $(CC) $(CFLAGS) -c -o $@ $*.cpp
028   
029   integration.o:integration.cpp integration.h
030        $(CC) $(CFLAGS) -c -o $@ $*.cpp
031   
032   interpolation.o:interpolation.cpp interpolation.h
033        $(CC) $(CFLAGS) -c -o $@ $*.cpp
034   
035   linalg.o:linalg.cpp linalg.h
036        $(CC) $(CFLAGS) -c -o $@ $*.cpp
037   
038   optimization.o:optimization.cpp optimization.h
039        $(CC) $(CFLAGS) -c -o $@ $*.cpp
040   
041   solvers.o:solvers.cpp solvers.h
042        $(CC) $(CFLAGS) -c -o $@ $*.cpp
043   
044   specialfunctions.o:specialfunctions.cpp specialfunctions.h
045        $(CC) $(CFLAGS) -c -o $@ $*.cpp
046   
047   statistics.o:statistics.cpp statistics.h
048        $(CC) $(CFLAGS) -c -o $@ $*.cpp
049   
050   #-------------- others ------------------------
051   .PHONY: clean
052   clean:
053        rm *.o
054        rm $(TARGET)

このファイルを,cpp/src/ にコピーします.そして,以下のコマンドで,ライブラリーを作成します.

$ make

warning が表示されますが,問題ないでしょう.気になるようでしたら,オプションを調整します.最後に,出来上がったライブラリーの内容を確認します.

$ ar -t libalglib.a
alglibinternal.o
alglibmisc.o
ap.o
dataanalysis.o
diffequations.o
fasttransforms.o
integration.o
interpolation.o
linalg.o
optimization.o
solvers.o
specialfunctions.o
statistics.o

ヘッダーとライブラリーのコピー

ALGLIB のヘッダーファイルをコピーします.

$ sudo mkdir /usr/local/include/alglib
$ sudo chmod 755 /usr/local/include/alglib
$ sudo cp *.h /usr/local/include/alglib/
$ sudo chmod 644 /usr/local/include/alglib/*.h

次に,ライブラリーをコピーします.

$ sudo cp libalglib.a /usr/local/lib/
$ sudo chmod 644 /usr/local/lib/libalglib.a

確認・使い方

ライブラリーを使った実行ファイルの作成例を示します.

先に示した「fft_real_d1 example」を例に,ライブラリーを使ったコンパイル方法を示します.ちょっとだけ変更したソースのプログラムを以下に示します.

fft_real_d1.cpp

001   #include <stdlib.h>
002   #include <stdio.h>
003   #include <math.h>
004   #include <alglib/stdafx.h>
005   #include <alglib/fasttransforms.h>
006   
007   using namespace alglib;
008   
009   
010   int main(int argc, char **argv)
011   {
012       //
013       // first we demonstrate forward FFT:
014       // [1,1,1,1] is converted to [4, 0, 0, 0]
015       //
016       real_1d_array x = "[1,1,1,1]";
017       complex_1d_array f;
018       real_1d_array x2;
019       fftr1d(x, f);
020       printf("%s\n", f.tostring(3).c_str()); // EXPECTED: [4,0,0,0]
021   
022       //
023       // now we convert [4, 0, 0, 0] back to [1,1,1,1]
024       // with backward FFT
025       //
026       fftr1dinv(f, x2);
027       printf("%s\n", x2.tostring(3).c_str()); // EXPECTED: [1,1,1,1]
028       return 0;
029   }

4–5 行に示す ALGLIB のヘッダーファイルのインクルードの仕方に注意が必要です.これをコンパイルするための Makefile は次のとおりです.

Makefile

001   #-------------- basic settings ---------------
002   TARGET = FFT
003   CFLAGS = -Wall
004   CC = g++
005   
006   #-------------- compile and link ---------------
007   $(TARGET):Makefile fft_real_d1.o
008       $(CC) $(CFLAGS) -o $(TARGET) fft_real_d1.o -lalglib
009   
010   fft_real_d1.o:Makefile fft_real_d1.cpp
011       $(CC) $(CFLAGS) -O3 -c  -o $@ $*.cpp
012   
013   
014   #-------------- others ------------------------
015   .PHONY: clean
016   clean:
017       rm *.o
018       rm $(TARGET)

ビルドと実行は,以下のとおりです.

$ make
g++ -Wall -O3 -c  -o fft_real_d1.o fft_real_d1.cpp
g++ -Wall -o FFT fft_real_d1.o -lalglib
$ ./FFT
[4.000,0,0,0]
[1.000,1.000,1.000,1.000]

ページ作成情報

参考資料

更新履歴

2015年11月21日 新規作成
2016年07月24日 ライブラリー化の説明の追加


no counter