GNU Octave (グニューオクターブ)は、数値計算を主目的とする高水準 プログラミング言語 および数値計算環境である。コマンドラインインタフェース およびGUI を備え、MATLAB と大部分が互換な言語として利用できる。GNUプロジェクト の一つで、GNU General Public License (GPL) の下で配布される自由ソフトウェア である[ 3] [ 4] [ 5] [ 6] [ 7] [ 8] 。
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 withQt 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は多くのUNIX やUnix系 プラットフォーム 、macOS 、Windows で実行できる[ 15] 。
ユーザーがデータ構造をある程度定義できる。たとえばスカラー、行列、文字列の異なる型を持つひとつの構造体を以下のようにして定義できる:
octave:1> x.a = 1; x.b = [1, 2; 3, 4]; x.c = "string";octave:2> x.aans = 1octave:3> x.bans = 1 2 3 4octave:4> x.cans = stringoctave:5> xx ={ 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++プログラムから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 ()); OctaveはMATLABとの互換性を重要視しており、多くのMATLAB用プログラムは修正なし、もしくは最小限の修正でOctave上でも動作する。
両者の主な共通点は以下の通りである:
行列を基本なデータ形式として扱う 複素数に対応している 強力な組み込み関数とライブラリを備える ユーザ定義関数によって機能を拡張できる 両者の相違点は公式サイトのFAQにまとめられており[ 17] 、一例として以下のような特徴がある:
% のほか # もコメントとして扱われる ++、--、+=、*=、/= などのC言語 風の演算子が使用できる [1:10](3) のように、一時的な配列に対して直接要素を参照できる ' のほか " を用いて文字列を定義できる ^ “Frequently asked questions about Octave (with answers) ” (英語). 2011年2月14日閲覧。 ^ “GNU Octave 9.4.0 Released ”. 2025年2月15日閲覧。 ^ Trappenberg, Thomas (2010). Fundamentals of Computational Neuroscience . Oxford University Press. p. 361. ISBN 978-0-19-956841-3 ^ Muhammad, A; Zalizniak, V (2011). Practical Scientific Computing . Woodhead Publishing . p. 3. ISBN 978-0-85709-226-7 ^ Megrey, Bernard A.; Moksness, Erlend (2008). Computers in Fisheries Research . Springer Science & Business Media. p. 345. ISBN 978-1-4020-8636-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 ^ Herman, Russell L. (2013). A Course in Mathematical Methods for Physicists . CRC Press. p. 42. ISBN 978-1-4665-8467-9 ^ 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 ^a b Eaton, John W. “About Octave ”. 2009年6月28日閲覧。 ^ Social Security Number Vulnerability Findings Relied on Supercomputing HPCwire, July 8, 2009.^ 末岡洋子 (2014年1月6日). “「GNU Octave 3.8.0」リリース、ついにGUIを搭載” . SourceForge.JP Magazine . http://sourceforge.jp/magazine/14/01/06/152000 2014年2月10日閲覧。 {{cite news }}: CS1メンテナンス: 先頭の0を省略したymd形式の日付 (カテゴリ )^ “GNU Octave - Controlling subprocesses ” (2008年11月14日). 2009年1月28日閲覧。 ^ “GNU Octave ”. 2009年1月28日閲覧。 ^ “FAQ: MATLAB compatibility ”. 2009年7月4日閲覧。 ^ “FAQ: Getting Octave ”. 2009年7月4日閲覧。 ^ CLHS: Special Operator UNWIND-PROTECT Common Lisp Hyper Specのサイトでの解説(英語)^ How is Octave different from Matlab? 互換性に関するFAQ 英語版ウィキブックスに本記事に関連した解説書・教科書があります。
一部を除いて、全て英語のサイトである。