手習ひデジタル信号処理(68) Scilab、sce拡張子とsci拡張子の使い分けの件

Joseph Halfmoon

今回は信号処理ネタではなくScilabの使い方です。Scilabのスクリプトをファイルとして格納するとき、拡張子をsceとしたらよいのか、sciとしたらよいのか理解しておらず、「とりあえず」ということでsce一辺倒でした。しかし調べてみたらsciにする御利益があるのでした。これだから素人はイケない。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。

sce と sci

Scilabのスクリプト、単なるテキストのソースファイルなのですが、これをしまうときに拡張子を .sce とするのか、.sci とするのか選択の余地があります。このとき、

    • Scilab上で即実行するようないわゆるスクリプトであれば sce
    • 関数定義(マクロ)であればsci

というお約束になっているようです。しかし sceとsciを使い分ける意味わかってませんでした。別に拡張子 sce としているファイルに関数定義を格納しておいても使えるし、sciファイルも実行すれば動作するし。。。

しかし ライブラリ というものを考えたとき、がぜん sci 拡張子がありがたいものになるのでありますな。Scilab素人は目から鱗だあ。

ライブラリとその作成

ライブラリというのはScilabの関数などをまとめたものであるようです。

    1. フォルダ(ディレクトリ)内のコンパイル済の関数のbinファイル群
    2. 上記binファイル群を列挙する台帳らしい lib という名のXMLファイル

からなります。そしてライブラリはまとめてロードすることができると。便利。

さてライブラリを作成する際には、genlib() という関数を使うのですが、

genlib()が処理の対象にするのは sci 拡張子のファイルのみ

なんであります。つまりライブラリ化したい関数ファイル群があったとしてフォルダ内に配置する場合には .sci 拡張子でなければならないのでした。

念のためsce拡張子のファイルが詰まったフォルダにgenlib()かけてみました。すると空の(中身に関数が列挙されていない)libファイルだけが出来てました。とほほ。

よって「後でライブラリ化」する気があるなら sci 拡張子にしておくに限る、ということであります。

なお、genlibについては、こちらにHelpがあります。一例をあげておくと、pwd(カレントのワーキングディレクトリ)の配下に scilab\sciというディレクトリがあって、そこにsciファイルが詰まっている場合、

genlib('test','scilab\sci')

などとすると、testというライブラリ名でsciフォルダ内をライブラリ化してくれます。また、genlibはライブラリ生成後、そのロード処理までしてくれるみたいっす。知らんけど。

なお、ソースファイルを修正などして再コンパイル、再ライブラリ化する場合は、第3引数に %t を与えないとならないようです。デフォルトでは%fになっていて、重ねてgenlib実行しても.binファイルの再生成はされないにロックされているようです。

ライブラリとしてのロードは、上記のgenlibの副作用でも可能みたいですが、以下のようにload()関数で lib ファイルを指定するか

load('scilab\sci\lib')

lib()関数でパスを指定して、明示的に変数(以下例ではaliasName)に代入すれば使えるようになりました。

aliasName = lib('scilab\sci')

loadの場合は、libファイル内に記載されているライブラリ名(上のgenlib生成例では test )が使用されますが、変数に代入した場合は変数名がそのままライブラリ名になるみたいっす。なお、libの結果をどこにも代入しないと ans に代入されてしまうので、仮初な存在として直ぐに消えてしまいます。

以降は特にライブラリ名など気にせずに関数名から書けば使用可能となります。

ライブラリ名の列挙、ライブラリ内の関数の列挙

上記のようにライブラリが構築できると、現在どんなライブラリが使えるのか知りたくもなります。そのときは以下のようにすれば列挙可能であります。librarieslist

上記はとても長いリストになるので以下略です。Scilab、裏では大量のライブラリを黙って使えるようにしてくれてるのね。

上記にお名前が列挙されていれば該当のライブラリが使用可能ということです。該当のライブラリ内で定義されている関数を列挙するのは以下のように(以下例では信号処理のライブラリをあさってます。)signalProcessingLib

これまたとても長いリストなので以下略です。それぞれのライブラリ内で大量の関数が定義されております。なお、関数名がわかれば以下のようにすることで該当の関数.sciファイルの在処を調べることも可能です。

get_function_path('関数名文字列')
おまけ、ライブラリ化しなくても sciファイルまとめてロード

上記のようにライブラリ化するといろいろご利益があるのですが、ライブラリ化しなくても sci 拡張子になっていると使える小技がありました。

getd(path)

getd()でsciファイル群が格納されているディレクトリを指定しておけば、パスの中の全sciファイルを対象に、関数名を呼び出すだけで使えるようになってます。この場合はライブラリとしては認識されないので元の個別のsciファイル対象みたいっす。

ちょっとはスッキリした?

手習ひデジタル信号処理(67) Scilab、IIRフィルタでフィルタしようとしてハマった件 に戻る

手習ひデジタル信号処理(69) Scilab、ATOMS、モジュール管理 へ進む