Algae

Algae は数値解析のためのインタプリタ言語です。 行列演算は Octave よりも高速で、特に疎な行列に対して高速化が計られているようです。 シンタックスは MATLAB や Octave よりも RlaB に似ています。 グラフ表示は gnuplot を利用します。

作者: Scott Hunziker さん、 Mike Brennan さん
ホームページ: http://algae.sourceforge.net/
バージョン: 4.3.6 (2004/02/22)
ライセンス: GPL
README を読む
付属ドキュメント User's Manual を読む

Algae は以前は Alki という名で知られていました。

使い方

インストールしたら、早速使ってみましょう。 起動はターミナルから algae と入力します。

$ algae
>

終了は exit() を入力します。 (コマンドラインオプション等は man algae を参照してください。)

コマンドライン入力には readline ライブラリが使われているので bash などと同じようにカーソルキーで前の入力を呼び出したり、入力行の編集ができます。

help と入力すると短いへルプが出ます。

> help
        "
This is Algae, an interpreted language for numerical analysis.

EXITING:   To exit Algae, type `exit()'.

INFO:      The manual is available on-line through the `info' function.  Type
           `info()' to view it or `info("abs")', for example, to go to a
           description of the `abs' function.

READLINE:  Command line editing and history is available on most systems.
           The arrow keys on your keyboard allow basic editing -- more
           sophisticated commands are also available. 

SOURCE:    Algae is free software.  See the documentation for license,
           warranty, and permission details.
"

Algae の文法は C に似ています。

> printf("hello, world\n");
hello, world

式の最後の ";" を付けなければ式の値が表示されます。

> a=1+2*3
        7

変数名は(数字で始まらない)英字、数字、ドル“$” またはアンダスコア“_”の列です。大文字、小文字は区別されます。 長さの制限は(1以上という点を除いて)ありません。 先頭が“$”の名前はいくつか内部で使われるので避けたほうがいいでしょう。 例えば、$beep を 0 以外にセットするとエラー発生時にベルが鳴ります。

式に ";" を付けないときの)表示の精度はデフォルトでは 4 桁ですが、関数 digits() で変更できます。

> digits(20)
        20
> atan(1)*4
        3.1415926535897931160

digits() の引数を省略すると現在の設定を返すのみで設定は行ないません。

虚数単位を表す記法や変数は用意されていないので、 必要なら例えば次のように自分で定義して使います。

> i = sqrt(-1)
        0.000 + 1.000*i
> (1 + 2*i)^2
        -3.000 + 4.000*i

変数名の一覧は who() で得られます。関数の一覧は what()です。

> who()
        a     help  i

うむ、help というのは変数だったんですね。 個々の変数について調べるのは show() です。

> show(help);
        class:     scalar
        type:      character
	NULL

変数には class, type などの属性があります。これらを調べるには

> a.class
        "scalar"

のようにします。
タイプは integer、real、complex、character の4つです。 クラスには、scalar、vector、matrix、table、function が あります。table は C の構造体のようなもので、 どのクラスも table のメンバーにすることができます。 table の作成とメンバーの参照は次のようにします。

> T = {x = 1; y = "one"}
        x  y
> T.y
        "one"

Algae の文法は C によく似ていますが、大きく違うのは次の点です。

(1)
カンマ "," は アペンドの意味です。

x = 1, 2, 3;

とすると vector を作ります。vector に scalar をアペンドすれば 結果も vector です。
(2)
カンマがアペンドの演算子であるために、関数の引数の区切りは ";" を使います。

printf("x = %d\n"; T.x);
x = 1

(3)
演算子 "^" は冪乗です。"&&" は C と同じように 左側が False なら右側を評価しない論理 AND ですが、"&" は (ビット演算ではなく) 無条件に左右の被演算子を評価する論理 AND です。 "||" と "|" も同様です。

さて、準備ができたところで行列の演算をやってみましょう。
行列の入力は次のようにします。

> A = [1,2,3;4,5,6]
        [           1          2          3 ]
        [           4          5          6 ]

列の区切りは カンマ , 行の区切りは セミコロン ; です。 各要素は A[2;3] のようにして (数学の記法と同じで行が先) 参照したり代入したりできます。文字列の行列も作れます。
部分行列の参照は A[1:2;2:3] のようにします。 記法「n:m」は n から m までの要素を持つベクトルを生成します。 n:m:k とすると増分が k になります。
A[1,2;1,3] は「行の 1 と 2、列の 1 と 3」の意味になります。 行あるいは列の要素順は任意です。

> B = A[2,1;1,3,2]
        [           4          6          5 ]
        [           1          3          2 ]

全要素がゼロの行列は zero() で作れます。

> Z = zero(2,3)
        [           .          .          . ]
        [           .          .          . ]

"." で表示されるのは sparse の意味で、要素の値を求めれば 0 が返ります。

行列の演算は +、-、/ は要素同士の演算になります。

> A / B
        [        0.2500       0.3333       0.6000 ]
        [         4.000        1.667        3.000 ]

行列の乗算は * でできます (* は vetor 同士なら内積を返します)。 2 × 3 の行列同士では積は定義されませんから B を 転置して掛けてみましょう。 転置 (複素数なら共役) の演算子は シングルクォート ' です。

> B'
        [           4          1 ]
        [           6          3 ]
        [           5          2 ]
> A * B'
        [          31         13 ]
        [          76         31 ]

演算子 @ では要素ごとの積になります。 sin() とか、スカラーとの演算は要素ごとに計算されます。

連立方程式

11x + 3y = 1, 2x + y = 0

を解くには次のようにします。

> A = [11, 3; 2, 1];
> b = [1; 0];
> solve(A;b)
        [        0.2000 ]
        [       -0.4000 ]

同じ係数行列を使って何度も解く場合は次のようにすると効率的です。

> A = [11, 3; 2, 1];
> C = factor(A);
> b = [1; 0];
> solve(C;b)
        [        0.2000 ]
        [       -0.4000 ]

factor() は IPIV, LU, RCOND をメンバーとする table を返します。 この table を solve() に与えると後退代入のみ行なうように なっているので、毎回元の行列から計算するのに比べるとタダ同然の時間で 計算できます。 実際の solve() は /usr/share/algae/4.3.6/tools/solve.A で次のように なっています。

solve = function (A; b; options)
{
  if (class(A) != "table")
  {
    if (options != NULL && members (options) == "pos")
    {
      A = chol (A);
    else
      A = factor (A);
    }
  }

  return backsub (A; b);
};

クラスが vector や matrix の場合、class、type 以外にもいくつか 属性が付いています。

> show(A);
        class:     matrix
        type:      integer
        nr, nc:    2, 2
        rid, cid:  NULL, NULL
        symmetry:  general
        density:   dense
        nn:        4

nr, nc は行と列の数です。 rid, cid は、行と列の名前 (id) です。

インストール

最新バージョンの RPM パッケージは SourceForge のプロジェクトページ から入手できます。
LinuxMLD 7 では依存するパッケージとして libf2c および gnuplot を追加インストールする必要があります。
残念ながら、MLD 5,6 でインストールできる RPM パッケージは配布されていません。

rpm コマンドでインストールするには、スーパーユーザになって

# rpm -i algae-4.3.6-1.i386.rpm

とします。

その他

上記の RPM では、HTML のブラウザとして mozilla が設定されています。 変更するには /usr/lib/algae/4.3.6/algae.Axhtml = の行を探して修正してください。 gnuplot/usr/bin/gnuplot 以外の場合も gnuplot = の行を探して修正してください。
HTML ブラウザが見つからないときは info コマンドが起動されます。

参考

類似のアプリケーションについては Octave のページを参照してください。

[2002/08/27 作成] [2007/02/07 更新]


このページに関する御意見、御要望を science@mlb.co.jp までお寄せ下さい
Copyright © 2002-2007 Media Lab. All Rights Reserved.