トップページ -> 研究道具箱と教材 -> Ruby プログラミング -> Ruby から Octave の機能を呼び出す
[サイトマップへ]  

Ruby から Octave の機能を呼び出す

http://octave-ruby.rubyforge.org/octave-ruby/ の記述に従って, octave-ruby のインストールとテスト実行を行います.

Octave には次のような便利な機能があり,こうした機能を Ruby から呼び出したいということです.

◆ この Web ページで行うコマンドの概略 (Ubuntu の場合)

# Ruby の gem ファイルのダウンロード、展開 (unpack)、展開されたファイルからの gem ファイルの生成
cd /tmp
gem fetch octave-ruby 
gem unpack octave-ruby-1.0.9.gem
rm -f octave-ruby-1.0.9.gem
cd octave-ruby-1.0.9
# ファイル書き換え
cat ext/octave_api/octave-ruby.cpp | sed 's/curr_sym_tab = top_level_sym_tab;//g'  | sed 's/octave_allocation_error = 0;//g' > /tmp/octave-ruby.cpp.$$
cp /tmp/octave-ruby.cpp.$$  ext/octave_api/octave-ruby.cpp
gem build octave-ruby.gemspec
# ビルドとインストール
sudo gem install octave-ruby-1.0.9.gem -l  -- --with-octave-include=/usr/local/include/octave-3.4.2/octave --with-octave-lib=/usr/local/lib/octave/3.4.2/lib --with-dep-include=/usr/lib/ruby/1.8/
cd /usr/lib/ruby/gemss/1.8/gems/octave-ruby-1.0.9
sudo ruby setup.rb

Linux での事前準備

  1. インストール済みのパッケージを最新のものにアップデートする操作を行っておく.

    端末で次のように操作する。

    ◆ Ubuntu の場合の操作手順(例)

    sudo apt-get update 
    sudo apt-get -yV upgrade
    sudo shutdown -r now 
    

    ■ Fedora の場合の操作手順(例)

    yum check-update
    yum update
    

  2. ruby のインストール操作を行っておく

    ■ Ubuntu の場合の操作手順(例)

    sudo apt-get install ruby-full
    sudo apt-get install ruby1.9.1-full
    sudo apt-get install ruby1.8-examples
    sudo apt-get install ruby1.9.1-examples
    sudo apt-get install rubygems
    

  3. octave のパッケージ開発用ソフトウエアのインストール

    ■ Ubuntu の場合の操作手順(例)

    sudo apt-get install octave-pkg-dev
    

octave-ruby を gem を使ってインストール

  1. octave-ruby の gem ファイルのダウンロードと展開 (unpack)

    ■ 操作手順(例)

    cd /tmp
    gem fetch octave-ruby 
    gem unpack octave-ruby-1.0.9.gem
    rm -f octave-ruby-1.0.9.gem
    

  2. ext/octave_api/extconf.rb の編集

    変更前

    have_library("octinterp", "octave_main" )
    

    変更後

    have_library("octinterp")
    

  3. ext/octave_api/octave-ruby.cpp の編集

    octave-ruby パッケージが、「新しい」octave に対応していないことに起因する。

    cd /tmp/octave-ruby-1.0.9
    cat ext/octave_api/octave-ruby.cpp | sed 's/curr_sym_tab = top_level_sym_tab;//g'  | sed 's/octave_allocation_error = 0;//g' > /tmp/octave-ruby.cpp.$$
    cp /tmp/octave-ruby.cpp.$$  ext/octave_api/octave-ruby.cpp
    

    ※ 上のようなコマンドに慣れていない人は,下記のようにエディタ等で編集してもいい

  4. (Ruby バージョン 1.9 の場合のみ) octave-ruby パッケージのファイルの調整

    Ruby バージョン 1.9 系列 の ruby.h に起因する変更である。Ruby バージョン 1.8 系列を使う場合には、この編集を行ってはいけない。

      # Ruby バージョン 1.9 系列 の ruby.h の RArray に起因する変更
    cat ext/octave_api/octave-ruby.cpp | sed 's/->ptr/->as.heap.ptr/g'  | sed 's/->len/->as.heap.len/g' > /tmp/octave-ruby.cpp.$$
    cp /tmp/octave-ruby.cpp.$$  ext/octave_api/octave-ruby.cpp
    cat ext/octave_api/or-array.cpp | sed 's/->ptr/->as.heap.ptr/g'  | sed 's/->len/->as.heap.len/g' > /tmp/or-array.cpp.$$
    cp /tmp/or-array.cpp.$$  ext/octave_api/or-array.cpp
    cat ext/octave_api/or-hash.cpp | sed 's/->ptr/->as.heap.ptr/g'  | sed 's/->len/->as.heap.len/g' > /tmp/or-hash.cpp.$$
    cp /tmp/or-hash.cpp.$$  ext/octave_api/or-hash.cpp
    cat ext/octave_api/or-cell_matrix.cpp | sed 's/->ptr/->as.heap.ptr/g'  > /tmp/or-cell_matrix.cpp.$$
    cp /tmp/or-cell_matrix.cpp.$$  ext/octave_api/or-cell_matrix.cpp
    cat ext/octave_api/or-struct_matrix.cpp | sed 's/->ptr/->as.heap.ptr/g' | sed 's/->len/->as.heap.len/g'  > /tmp/or-struct_matrix.cpp.$$
    cp /tmp/or-struct_matrix.cpp.$$  ext/octave_api/or-struct_matrix.cpp
    cat ext/octave_api/or-string.cpp | sed 's/->ptr/->as.heap.ptr/g'  > /tmp/or-string.cpp.$$
    cp /tmp/or-string.cpp.$$  ext/octave_api/or-string.cpp
    cat ext/octave_api/or-matrix.cpp | sed 's/->ptr/->as.heap.ptr/g'  > /tmp/or-matrix.cpp.$$
    cp /tmp/or-matrix.cpp.$$  ext/octave_api/or-matrix.cpp
      # Ruby バージョン 1.9 系列の ruby.h の RFloat に起因する変更
    cat ext/octave_api/octave-ruby.cpp | sed 's/RFLOAT(cell)->value/RFLOAT(cell)->float_value/g'  > /tmp/octave-ruby.cpp.$$
    cp /tmp/octave-ruby.cpp.$$  ext/octave_api/octave-ruby.cpp
    cat ext/octave_api/or-array.cpp | sed 's/RFLOAT(cell)->value/RFLOAT(cell)->float_value/g'  > /tmp/or-array.cpp.$$
    cp /tmp/or-array.cpp.$$  ext/octave_api/or-array.cpp
    cat ext/octave_api/or-variable.cpp | sed 's/->value/->float_value/g'  > /tmp/or-variable.cpp.$$
    cp /tmp/or-variable.cpp.$$  ext/octave_api/or-variable.cpp
    cat ext/octave_api/or-matrix.cpp | sed 's/RFLOAT(cell)->value/RFLOAT(cell)->float_value/g'  > /tmp/or-matrix.cpp.$$
    cp /tmp/or-matrix.cpp.$$  ext/octave_api/or-matrix.cpp
    

  5. gem ファイルの生成

    cd /tmp/octave-ruby-1.0.9
    gem build octave-ruby.gemspec
    

  6. ビルドとインストール

  7. /etc/ld.so.conf の調整
    echo "/usr/lib/octave-3.2.4" | sudo tee -a /etc/ld.so.conf
    ldconfig
    

テスト実行

◆ サンプルプログラム

http://octave-ruby.rubyforge.org/octave-ruby/ に記載のサンプルプログラムを実行してみる.

◆事前準備

cd /tmp
wget http://www.kkaneko.jp/free/stand/lena_std.jpg
rm -f /tmp/hoge.png

◆ 画像ファイルの読み込みと書き出し

require 'octave'
engine = Octave::Engine.new
engine.eval 'img = imread("/tmp/lena_std.jpg");'
engine.eval 'imwrite(img, "/tmp/hoge.png");'

3次元の配列からの要素の取り出し方 1次元または2次元の配列で,要素が浮動小数点に限り取り出せるので, r = engine.eval 'double( rgb(:,:,1) )' のように