GNU Octave

**GNU Octave**（グニューオクターブ）は、数値計算を主目的とする高水準プログラミング言語および数値計算環境である。コマンドラインインタフェースおよびGUIを備え、MATLABと大部分が互換な言語として利用できる。GNUプロジェクトの一つで、GNU General Public License(GPL) の下で配布される自由ソフトウェアである。

## 開発の経緯
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、反応工学）に由来する。

当初は個人的な利用を目的としていたが、現在では学術分野や産業分野でも利用されている。例えば、米国ピッツバーグ・スーパーコンピューティング・センター (Pittsburgh supercomputing center) では、社会保障番号を推測する攻撃手法の脆弱性評価に用いられた。

ユーザインタフェースは長らくCUIのみであったが、3.8.0からはGUIが導入された。

## 特徴
* 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のシステムコールもいくつか利用できる。しかし関数呼び出しで引き数の参照渡しはサポートされていない。

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

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

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

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

```
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`'を実装しており、例外処理を記述することができる。unwind_protectブロックはOctaveでは以下のように書かれる：


```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 との互換性のため他の例外処理も使える：

```octave
try
   body
catch
   exception_handling
end
```


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

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


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


### 返り値
`varargout`を使うことで返り値の数を実行時に決める、すなわち可変長にする事ができる：


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


### C++との統合
C++プログラムからOctave の関数を呼ぶことができる。以下の例では、`rand([10,1])`というOctaveの関数をC++から呼び出している：


```cpp
#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上でも動作する。

両者の主な共通点は以下の通りである：

# 行列を基本なデータ形式として扱う
# 複素数に対応している
# 強力な組み込み関数とライブラリを備える
# ユーザ定義関数によって機能を拡張できる

両者の相違点は公式サイトのFAQにまとめられており、一例として以下のような特徴がある：

# % のほか # もコメントとして扱われる
# ++、--、+=、*=、/= などのC言語風の演算子が使用できる
# [1:10](3) のように、一時的な配列に対して直接要素を参照できる
# ' のほか " を用いて文字列を定義できる

## 関連項目
* 数値解析ソフトウェア
* 類似のソフトウェア
** FreeMat
** MATLAB
** Scilab

## 脚注


## 参考文献

* Hansen, Jesper (June 2011). GNU Octave Beginner's Guide. Packt Publishing.

## 外部リンク
一部を除いて、全て英語のサイトである。
* Octave.org Home Page
*  (旧版2.1.xの日本語訳)
* コミュニティによる開発サイト Octave-forge
* Octave wiki （ブラウザによってはリダイレクトがタイムアウトを生じるので，2回クリックするとよい）
* Online access to Octave オンラインでOctaveによる計算を試せる。
* Octave - AIMSWiki
* QtOctave un Front-End para Octave - インターフェイスをグライフィカルに拡張したQtOctaveを開発している。
* DomainMath IDE - GUIフロントエンドを開発している。オープンソース。
* MATLAB Central MATLABのユーザーコミュニティのサイト。多くの科学技術計算スクリプトが投稿され、ユーザーにより評価されている。MATLABの別売りToolboxを使わないスクリプトは、GNU Octaveでそのまま利用できるものも多い。
* Octave Programming Tutorial WikiBooks プロジェクト内のドキュメント集。