GNU Octave

提供: miniwiki
移動先:案内検索

GNU Octave は、主に数値解析を目的とした高レベルプログラミング言語である。Octaveは線形ならびに非線形問題を数値的に解くためのコマンドライン·インタフェースを提供する。また、 MATLABとほぼ互換性のある、数値実験を行うためのプログラミング言語として使用することができる。 Octaveは、GNUプロジェクトの一つでGNU General Public Licenseの条件の下のフリーソフトウェアである。 GNU OctaveとScilabは、MATLABのオープンソース代替品の一つである。 ただし、Octaveは、ScilabよりもMATLABとの互換性維持に重点を置いている[1] [2] [3] [4] [5] [6]

開発の経緯

開発が始まったのは1988年ごろである。当初は化学反応器設計の授業で使うために作られたが、その後1992年から、ジョン・イートン (John W. Eaton) が開発を始めた。彼による最初のアルファ版のリリースは1993年1月4日で、正式版 (ver. 1.0) は翌年、1994年2月17日にリリースされた。2007年12月21日にバージョン3.0が、2015年5月29日にはバージョン4.0がリリースされた。

Octaveという名前は、イートンの指導教官であり、裏紙にでも軽く書いてやるような概算の計算 (back-of-the-envelope calculation) が速かった元オレゴン州立大学教授のオクターブ・レヴェンシュピール(Octave Levenspiel反応工学)にちなむ[7]

当初の目的である個人的な計算機としての利用に加え、Octaveは学術的及び工業的な用途にも使われている。例えば米国ピッツバーグ・スーパーコンピューティング・センター (Pittsburgh supercomputing center) では大規模並列計算による社会保障番号の攻撃に対する脆弱性検証に、Octaveを使っている[8]

ユーザインタフェースは永らくCUIのみであったが、3.8.0からはGUIが搭載された[9]

特徴

  • MATLAB 互換のプログラミング言語のインタプリタを実装しており、またGUIの開発環境がそろっている。
  • C++STLを用いている。
  • Mex-fileならびにOct-fileとよばれる仕組みを用いて、C/C++言語で記述された自作関数によりOctaveを拡張可能である。
  • Octave 4.0からグラフィックはgnuplot からOpenGL graphics with Qt widgetsへ変更された。
  • Octaveは行列計算でBLASを呼び出しているため高速かつ信頼性が高い。
  • Octave 4.0からOpenMPがデフォルトで有効になっており、システムにOpenMPが実装されている場合、計算の高速化が期待できる。

計算機言語としての Octave

Octaveを操作するための命令系統は、計算機言語でもある。OctaveはC言語のような構造化言語であり、C言語の標準ライブラリに含まれる多くの関数がOctaveでも実装されている。またUNIXシステムコールもいくつか利用できる[10]。しかし関数呼び出しの際の、引き数値の参照渡しはサポートされていない [11]

Octave言語で書かれたプログラムは、関数呼び出しの並びで構成されるスクリプトである。その文法は行列計算が基本であり、スクリプトにおいては行列計算の演算子が多数利用できる。多種多様なデータ構造を利用できる他,3.2以降のバージョンでは,オブジェクト指向プログラミング機能が付加された。

Octaveの文法はMATLABのものと非常によく似ており、少し注意してプログラミングすることでOctaveとMATLABの両方で実行できるスクリプトを書くことができる[12]

OctaveはGNU General Public Licenseによって公開されているため、その改変、複製、利用は自由である[7]。Octaveは多くの UNIXUnix系プラットフォームmacOSWindows で実行できる[13]

関数名、変数名の補完

対話的に実行中のOctaveのコマンドラインでタブを入力すると、関数名、変数名、ファイル名の入力を補完する(Bashタブ補完 (en) と同様の機能)。その時点でカーソルの直前に入力されているテキストを補完する。

ヒストリ機能

対話的に実行中のOctaveでは、それまでに入力されたコマンドラインが保存されており、必要に応じて修正して再実行できる。

データ構造

Octaveではユーザーがデータ構造をある程度定義できる。たとえばスカラー、行列、文字列の変数を持つ構造体を以下のようにして定義できる。

octave:1> x.a = 1; x.b = [1, 2; 3, 4]; x.c = "string";
octave:2> x.a
ans =  1
octave:3> x.b
ans =

   1   2
   3   4

octave:4> x.c
ans = string
octave:5> x
x =
{
  a =  1
  b =

     1   2
     3   4

  c = string
}

条件判定のショートカット

Octaveで条件判定に使われる論理演算の二項演算子、'&&' および '||' が評価されるときには、短絡評価が行われる(C言語の場合と同様)。一方、条件判定に '&' および '|' 演算子を使った場合は短絡評価は行われない。

インクリメントおよびデクリメント演算子

OctaveにはC言語と同様の '++' および '--' 演算子があり、やはりC言語と同様に変数の前及び後ろに置くことができる。変数値の増減後に代入を行う '+=' および '-=' 演算子もある。

Unwind-protect

OctaveではLISPの 'unwind_protect'[14]を実装しており、それによる例外処理を記述することができる。unwind_protectブロックはOctaveでは以下のように書かれる。

unwind_protect
   body
unwind_protect_cleanup
   cleanup
end_unwind_protect

Octaveでは一般的に、ブロックの終端は 'end' キーワードで示される(MATLAB と互換である)が、'end_block' でも示すことができる。'unwind_protect' ブロックでも 'end' に加えて 'end_unwind_protect' を使うことができる。

unwind_protectのcleanup部は、常に実行される。body部で例外が発生した場合は、その時点でcleanupが実行され、 'unwind_protect' ブロックの残りの部分が評価されることはない。

Octaveでは他の例外処理も使える(MATLAB との互換性を持たせるため)。

try
   body
catch
   exception_handling
end

この 'try' と 'catch' を使う例では 'unwind_protect' ブロックと違い、例外がbody部で発生したときにのみexception_handlingが実行される。またexception_handlingの実行後は、 'rethrow( lasterror )' 文がexception_handling部に記述されていない限りは、'try' ブロックの例外発生場所以降の部分が評価されることはない。

個数が可変の引数

Octaveでは関数の引数について、その個数の上限を指定することなく可変としておくことができる。引数が0個以上であることを指定するには、vararginを引数として指定する。vararginは、引数リストの最後に置くか、または唯一の引数として指定する。

function s = plus (varargin)
   if (nargin==0)
      s = 0;
   else
      s = varargin{1} + plus (varargin{2:nargin});
   end
end

個数が可変の返り値

Octaveの関数は、varargoutを使うことで返り値の数が実行時に決まるように記述できる。

function varargout = multiassign (data)
   for k=1:nargout
      varargout{k} = data(:,k);
   end
end

C++との統合

C++ソースプログラムの中から直接、Octave の関数を呼ぶことができる。以下の例では、rand([10,1])というOctaveの関数呼び出しをC++のプログラムの中から行っている。

#include <octave/oct.h>
...
ColumnVector NumRands(2);
NumRands(0) = 10;
NumRands(1) = 1;
octave_value_list f_arg, f_ret;
f_arg(0) = octave_value(NumRands);
f_ret = feval("rand",f_arg,1);
Matrix unis(f_ret(0).matrix_value());

MATLAB との互換性

Octaveは、MATLABとの互換性を主に目指しており、MATLABの機能の多くをOctaveも持っている。またMATLABのために書かれたプログラムも修正せずに動作するものが多い。

  1. 行列を基本のデータ形式にしている
  2. 複素数に対応
  3. 強力なbuild-in関数と、ライブラリを持つ
  4. ユーザ定義関数によって拡張可能

MATLABとOctaveの相異点については、オフィシャル・サイトのFAQにまとめられている[15]が、以下のようなものがある。

  1. 行頭に % の他に # を置いても、その行をコメントとすることができる
  2. ++, --, +=, *=, /= などのC言語の演算子が使える
  3. [1:10](3) などのように、変数 (インスタンス) を生成しなくても、配列の要素を参照できる
  4. ' の他に、" を使っても文字列を定義できる

関連項目

脚注

  1. Trappenberg, Thomas (2010). Fundamentals of Computational Neuroscience. Oxford University Press. ISBN 978-0-19-956841-3. 
  2. (2011) Practical Scientific Computing. Woodhead Publishing. ISBN 978-0-85709-226-7. 
  3. (2008) Computers in Fisheries Research. Springer Science & Business Media. ISBN 978-1-4020-8636-6. 
  4. Kapuno, Raul Raymond (2008). Programming for Chemical Engineers Using C, C++, and MATLAB. Jones & Bartlett Publishers. ISBN 978-1-934015-09-4. 
  5. Herman, Russell L. (2013). A Course in Mathematical Methods for Physicists. CRC Press. ISBN 978-1-4665-8467-9. 
  6. (2014) Simulation of ODE/PDE Models with MATLAB®, OCTAVE and SCILAB: Scientific and Engineering Applications. Springer, 114–115. ISBN 978-3-319-06790-2. 
  7. 7.0 7.1 Eaton, John W. “About Octave”. . 2009閲覧.
  8. Social Security Number Vulnerability Findings Relied on Supercomputing HPCwire, July 8, 2009.
  9. 末岡洋子 (2014年1月6日). “「GNU Octave 3.8.0」リリース、ついにGUIを搭載”. SourceForge.JP Magazine. http://sourceforge.jp/magazine/14/01/06/152000 . 2014閲覧. 
  10. GNU Octave - Controlling subprocesses” (2008年11月14日). . Jan 28, 2009閲覧.
  11. GNU Octave”. . Jan 28, 2009閲覧.
  12. FAQ: MATLAB compatibility”. . July 4, 2009閲覧.
  13. FAQ: Getting Octave”. . July 4, 2009閲覧.
  14. CLHS: Special Operator UNWIND-PROTECT Common Lisp Hyper Specのサイトでの解説(英語)
  15. How is Octave different from Matlab? 互換性に関するFAQ

参考文献

テンプレート:Wikibookslang

外部リンク

一部を除いて、全て英語のサイトである。

テンプレート:Numerical analysis software テンプレート:GNU テンプレート:Image processing software