GNU Octave

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
GNU Octave
Octave Sombrero.svg
開発元 John W. Eaton
初版 1988年 (1988)[1]
最新版 3.6.1 / 2012年02月22日(14か月前) (2012-02-22
プログラミング言語 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]

特徴 [編集]

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

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

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

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

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

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

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

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

  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. ^ GNU Octave - Controlling subprocesses” (2008年11月14日). 2009年1月28日閲覧。
  5. ^ GNU Octave”. 2009年1月28日閲覧。
  6. ^ FAQ: MATLAB compatibility”. 2009年7月4日閲覧。
  7. ^ FAQ: Getting Octave”. 2009年7月4日閲覧。
  8. ^ CLHS: Special Operator UNWIND-PROTECT Common Lisp Hyper Spec のサイトでの解説 (英語)
  9. ^ How is Octave different from Matlab? 互換性に関するFAQ

参考文献 [編集]

外部リンク [編集]

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