GNU Octave

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
GNU Octave
Gnu-octave-logo.svg
Octave Sombrero.svg
開発元 John W. Eaton
初版 1988年 (1988)[1]
最新版 3.8.1 / 2014年03月7日(5か月前) (2014-03-07
プログラミング言語 C++
対応OS クロスプラットフォーム
種別 数値解析ソフトウェア
ライセンス GNU General Public License
公式サイト www.gnu.org/software/octave/
テンプレートを表示

Gnu Octave とは、MATLABと互換性を持ったフリー数値解析ソフトウェアであり、GNUで開発している。

開発の経緯[編集]

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

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

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

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

特徴[編集]

  • C++STLを用いている
  • MATLAB 互換のプログラミング言語のインタプリタを実装している
  • DLLによって拡張可能
  • gnuplot を用いて、グラフを描画できる

計算機言語としての Octave[編集]

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

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

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

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

関数名、変数名の補完[編集]

対話的に実行中の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'[9]を実装しており、それによる例外処理を記述することができる。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にまとめられている[10]が、以下のようなものがある。

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

関連項目[編集]

脚注[編集]

  1. ^ Frequently asked questions about Octave (with answers)” (英語). 2011年2月14日閲覧。
  2. ^ a b Eaton, John W. “About Octave”. 2009年6月28日閲覧。
  3. ^ Social Security Number Vulnerability Findings Relied on Supercomputing HPCwire, July 8, 2009.
  4. ^ 末岡洋子 (2014年1月6日). “「GNU Octave 3.8.0」リリース、ついにGUIを搭載”. SourceForge.JP Magazine. http://sourceforge.jp/magazine/14/01/06/152000 2014年2月10日閲覧。 
  5. ^ GNU Octave - Controlling subprocesses” (2008年11月14日). 2009年1月28日閲覧。
  6. ^ GNU Octave”. 2009年1月28日閲覧。
  7. ^ FAQ: MATLAB compatibility”. 2009年7月4日閲覧。
  8. ^ FAQ: Getting Octave”. 2009年7月4日閲覧。
  9. ^ CLHS: Special Operator UNWIND-PROTECT Common Lisp Hyper Specのサイトでの解説(英語)
  10. ^ How is Octave different from Matlab? 互換性に関するFAQ

参考文献[編集]

外部リンク[編集]

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