2017年1月19日木曜日

c++11でliboctave

C++11でliboctave

liboctaveとは

前々から,やってみたかったのだが,簡単に数値計算をc++でできるliboctaveを導入してみた.
ていうか,matlabってあるじゃん.あの,お値段がとてつもなく高い数値計算用ソフト.あのお値段では,叶姉妹ぐらいのファビュラスなお金持ちでないと使うことができないのでは無いだろうか.いや,そうに違いない.

しかし,私は,お金持ちではないので創意工夫でどうにかするしか無い.そこでliboctaveである.matlabのコードがそのまま動くと言われているくらいmatlabにそっくりなoctaveっていう数値解析ソフトが存在し,それはc++11で実装されている.したがって,octaveを構成しているライブラリをc++11の自分のプログラムから呼び出すことが可能なのである.

Let’s 数値計算

環境は以下のとおりである

  • Ubuntu16.04(Linux mintの信者をやめたわけではない)
  • Cmake
  • LLVN Clang

さあ,パーティーの時間だ!!

$ sudo apt-get install octave liboctave-dev
$ sudo ldconfig

さあ,お片付けの時間だ!!

以下のようなテスト用のサンプルプログラムを用意します.

#include <iostream>
//#include </usr/local/include/octave-4.2.0/octave/config.h>
//octave-4.2.0ぐらいからはconfig.hはいらないらしい.コンパイラに怒られた.\(^o^)/

#include </usr/local/include/octave-4.2.0/octave/Matrix.h>

using namespace std;

  int main(int argc, char**argv)
  {
    Matrix A(2,3), B(2,2,1.0);
    ColumnVector x(3), y(2), z(2);
    for(int r(0); r<2; ++r)
      for(int c(0); c<3; ++c)
        A(r,c) = r+c;
    for(int r(0); r<3; ++r) x(r)=(r+1.0)*2.0;
    for(int r(0); r<2; ++r) y(r)=(r+1.0)*r;
    z = B*(A*x+y);

    cout<<"A="<<endl;
    cout<<A;
    cout<<"B="<<endl;
    cout<<B;
    cout<<"x= "<<x.transpose()<<endl;
    cout<<"y="<<y.transpose()<<endl;
    cout<<"z="<<z.transpose()<<endl;
    return 0;
  }

コンパイルは以下の感じで

clang++ -std=c+=11 test.cpp -loctave

Cmakeを使うときは以下の感じで

cmake_minimum_required(VERSION 3.5)
project(test)
add_executable(test test.cpp)
target_link_libraries(test octave)

結果は以下な感じざんす

A=
 0 1 2
 1 2 3
B=
 1 1
 1 1
x=  2 4 6
y= 0 2
z= 46 46

なんと言うことでしょう.
あの憎きmatlabと同等の環境を手に入れてしまった.ふはは.
何と言う高揚感!

まあ,当然のごとく,こういったことには先人がいて,わたしはコピーしただけなんだけどね.
どんなことができるかはここを見る