GNU Octave

数値解析を目的とした高レベルプログラミング言語

GNU Octave は、主に数値解析を目的としたプログラミング言語である。コマンドラインインタフェースを提供し、MATLABとほぼ互換性のある数値実験用プログラミング言語として使用できる。 Octaveは、GNUプロジェクトの一つでGNU General Public Licenseの条件の下のフリーソフトウェアである。GNU OctaveとScilabは、MATLABのオープンソース代替品の一つである。OctaveはScilabよりもMATLABとの互換性維持に重点を置いている[3][4][5][6][7][8]

GNU Octave
Gnu-octave のロゴ
Linux上で動かしたGNU Octave 4.0.0 RC1の画面。
Linux上で動かしたGNU Octave 4.0.0 RC1の画面。
開発元 John W. Eaton
初版 1988年 (1988)[1]
最新版
9.1.0 / 2024年3月14日 (20日前) (2024-03-14)[2]
リポジトリ ウィキデータを編集
プログラミング
言語
C++
対応OS クロスプラットフォーム - macOS, Linux, BSD
対応言語 日本語対応。
種別 数値解析ソフトウェア
ライセンス GNU General Public License
公式サイト www.gnu.org/software/octave/
テンプレートを表示

開発の経緯 編集

開発が始まったのは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という名前はイートンの指導教官である元オレゴン州立大学教授のオクターブ・レヴェンシュピール(Octave Levenspiel反応工学)にちなむ[9]

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

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

特徴 編集

  • MATLAB 互換のインタプリタを実装しており、GUIの開発環境もそろっている。
  • C++STLを用いる。
  • C/C++言語の自作プログラムをコンパイルし、Oct-fileとよばれる形式で呼び出せる。
  • Octave 4.0からグラフィックはOpenGL graphics with Qt widgetsを用いる。それ以前はgnuplot
  • 行列計算でBLASを呼び出しているため高速かつ信頼性が高い。
  • Octave 4.0からOpenMPがデフォルトで有効になっており、システムにこれが実装されている場合、計算の高速化が期待できる。

対話形式 編集

Octaveは対話形式で各種コマンドを入力する事で数値計算する。入力途中にタブを入力すると関数名、変数名、ファイル名等を補完する機能(Bashタブ補完 (en) と同様の)がある。また、それまでに入力されたコマンドラインが保存されており、必要に応じて修正し再実行できるヒストリ機能もある。

プログラミング言語 編集

対話形式で用いられるコマンドをスクリプト化しプログラミング言語のように扱う事ができる。C言語のような構造化言語であり、C言語の標準ライブラリに含まれる多くの関数が実装されている。またUNIXシステムコールもいくつか利用できる[12]。しかし関数呼び出しで引き数の参照渡しはサポートされていない[13]

スクリプトでは多数の行列演算子が利用できる。また多種多様なデータ構造を利用できる他、3.2以降のバージョンではオブジェクト指向が付加された。

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

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

データ構造 編集

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

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
}

条件判定 編集

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

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

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

例外処理 編集

LISPの 'unwind_protect'[16]を実装しており、例外処理を記述することができる。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' ブロックの残りの部分が評価されることはない。

MATLAB との互換性のため他の例外処理も使える:

try
   body
catch
   exception_handling
end

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

引数 編集

関数の引数の個数は上限を指定することなく可変にできる。引数が0個以上であることを指定するには、以下の通りvararginを引数として指定する:

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

返り値 編集

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プログラムは修正なしでOctaveで動作する。以下が両者の類似点である:

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

両者の相異点はオフィシャルサイトのFAQにまとめられている[17]が、例として以下のようなものがある:

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

関連項目 編集

脚注 編集

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

参考文献 編集

外部リンク 編集

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