C/C++ で力学シミュレータを作るときに,逆行列を掛けるのが面倒なので,
C++ 用のベクトル・行列ライブラリを探してみました.
文法の美しさでは Eigen がよかった.すごいかっちょいいソースが書けます.ヘッダーファイルだけというのもお手軽.
http://eigen.tuxfamily.org/
でも,CUDA で並列計算したいときは ArrayFire がいい感じ.ソースファイルは共通のまま,g++ のリンカーオプションを取り替えるだけで,CPU用とGPU用をコンパイルできます.
http://arrayfire.org/
Ubuntu 14.04 へのインストール
1.ダウンロード
http://arrayfire.com/download/
2.準備
※本家の説明ではパッケージ名 libglfw3 が誤植で glfw3 になってた.
sudo apt-get install libfreeimage-dev libatlas3gf-base libfftw3-dev cmake
sudo apt-add-repository ppa:keithw/glfw3
sudo apt-get update
sudo apt-get install libglfw3
3.インストール
sudo sh ArrayFire-*_Linux_x86_64.sh --exclude-subdir --prefix=/usr/local
4.コンパイル
ソースコードの例:
#include <arrayfire.h>
// Generate random data, sum and print the result.
int main(void)
{
// Generate 10,000 random values
af::array a = af::randu(10000);
// Sum the values and copy the result to the CPU:
double sum = af::sum<float>(a);
printf("sum: %g\n", sum);
return 0;
}
Makefileの例:
※$(CC)の前は,スペースじゃなくてタブにします.
#-lafcpu, -lafcuda, or -laf for the CPU, CUDA, and unified backends
LIBS=-lafcpu
LIB_PATHS=-L/usr/local/lib
INCLUDES=-I/usr/local/include
CC=g++ $(COMPILER_OPTIONS)
COMPILER_OPTIONS=-std=c++11 -g
all: main.cpp Makefile
$(CC) main.cpp -o test $(INCLUDES) $(LIBS) $(LIB_PATHS)