ScilabHowTos

ScilabについてのHOWTO集

リンク


目次

Scilab 5.0.2 が起動中に止まってしまう障害を回避する

この障害の原因として,新たにGUIのために利用されているJavaVMが起動時に確保するヒープメモリのサイズが実メモリに対して大きすぎる可能性がある.このヒープメモリの設定が記述されているファイルは,Scilabのインストール先のディレクトリをSCIとすると,
SCI/modules/jvm/etc/jvm_options.xml
である.このパスはWindowsであれば,次のようになる.
C:\Program Files\scilab-5.0.2\modules\jvm\etc\jvm_options.xml
この設定ファイル中のヒープメモリに関する設定項目は以下の部分
<option value="-Xmx1024m" />
であり,これは確保されるべきヒープメモリのサイズが1024MBであることを意味する.この1024mを,次のように実際に確保できる程度の量に減らせば,上記の障害を回避できる.
<option value="-Xmx256m" />

この設定は,javaコマンドのコマンドライン引数に相当しており,次のコマンドで説明が表示される.
java -X

Scilab 5.0.3 (Linux) でプロットをするとエラーが起きて異常終了する問題を回避する

OpenGL(Mesa)関連のライブラリをグラフィクス・チップに依存しないものに
置き換える(3次元プロットが遅くなるのはあきらめる).
libgl1-mesa-glx --> libgl1-mesa-swx11
原因?Intelのグラフィクス・チップに対するMesaGLの実装の問題?


3次元空間中の点の座標をプロットする

x = 0:.1:5;
y = x;
z = x;
param3d(x, y, z)

同じベクトルを並べた行列を作る

クロネッカー積(Kronecker product)の演算子'.*.'を使う.

v = [1 1 2 3 5 8]';
N = 10;
M = ones(1:N) .*. v;
disp(M);


行列の固有値,固有ベクトルを取得する.

Aを正方行列とする.Aの固有値,固有ベクトルは次の手順で得られる.
[D, U] = bdiag(A);
ここで,Dは固有値を成分に持つ対角行列 D = diag(v1, v2, ..., vn),Uは各列に各固有値に対応する固有ベクトルを並べた行列 U = [e1 e2 ... en]である.

ベクトルの並びを逆にする

v = v($:-1:1)
この'$'は参照しているベクトルの最後の要素の番号を表す予約語である.

行列束(matrix pencil)の一般固有値,一般固有ベクトルを取得する

A, Eを(単位行列とは限らない)正方行列とする.行列束(λE - A)の一般固有値,一般固有ベクトルは次の手順で得られる(λはスカラ).
[al,be,Z] = spec(A, E);
この列ベクトルalの各成分を,対応する列ベクトルbeの成分で除算した結果(al ./ be)が一般固有値であり,Zの各列が,各一般固有値に対応する一般固有ベクトルである.

サイズが違う複数の行列に対して,同じ処理を行う

リストを用いて実現できる.
x = list(rand(1:10), rand(1:20), rand(1:30));
for i=1:length(x), 
  m(i) = mean(x(i));
end;
ここでxはサイズが異なるベクトルを要素とするリストであり,x(i)はリストのi番目の要素を表す.

数値を表示する桁数を変更する

次のようにformatコマンドを実行する
format('v', <表示したい桁数>)
ただし<表示したい桁数>は小数点を含む.
scilab-4.1 fだと<表示したい桁数>の最大値は25?

正規乱数を取得する

n個の正規乱数を得るには次のようにする.
rand('norm');
n = 10000;
x = rand(1:n);
nc = 100;
histplot(nc, x);
ここに,rand('norm')は乱数生成関数rand()が出力する乱数の種類を正規乱数に設定する.これにより得られる乱数は算術平均が0, 分散が1の正規分布に従う.xはn個の乱数から成るベクトルである.最後のhistplot(nc, x)は,実行結果の確認のための文であり,階数をncとして,xに含まれる乱数のヒストグラムを描く.


デフォルトではrand()のが出力する乱数は区間[0,1]の一様分布に従う.rand()が出力する乱数の種類を一様乱数に戻すにはrand('uniform')を実行する.

連続線分を描く

  • 例: 五角形
th = 0:2*%pi/5:2*%pi; // 2*πを5分割
p1 = [cos(th); sin(th)];
R = [cos(%pi/2), -sin(%pi/2); sin(%pi/2), cos(%pi/2)]; // 回転行列
p2 = R*p1;
h = scf(); // ウィンドウを作成
xpoly(p2(1,:), p2(2,:)); // 五角形を描く
i = modulo((0:2:10), 5) + 1; // 五芒星描画の順序の添え字を得る
xpoly(p2(1,i), p2(2,i)); // 五芒星(☆)を描く
ha = h.children(1); // Axes(座標軸)オブジェクトへのハンドルを取得
ha.isoview = "on"; // 座標軸の縦横比を等しくする
ha.data_bounds = [-1, -1; 1, 1]; // 座標軸表示範囲の設定 


マークのサイズ,種類と識別番号の対応表を表示する

連続線分(polyline)の設定項目のmark_style, mark_sizeに指定する識別番号と,それに対応するマーク,サイズ(mark_size_unit = "tabulated"の場合)を表示するには次の関数を実行する.
getmark()

設定項目line_styleについて,同様の関数としてgetlinestyle()がある.

公式オンライン・ヘルプ中の説明: polyline_properties

JavaプログラムからScilabを呼び出す(未確認)

SCIをscilabのインストール先のディレクトリとする(Windowsだったらc:\Program Files\scilab-4.1.2など).

Linuxの場合は,SCI/examples/callsci/callsciJava/ihm/READMEに書かれている作業を行う.
Windowsの場合はSCI\examples\callsci\callsciJava\ihm\Readme(Windows).txtに書かれている作業を行う.


New graphics modeで図を描く

INRIAの公式サイトによると、Scilab 4.x よりも後のバージョンでは所謂 old graphics modeが使えなくなり、new graphics modeで描画を行う必要がある。具体的にはxbasc()などの一部のx*()という形式の描画関数が使えなくなるので、clf()などの新たな描画関数を用いる必要がある。したがって、古い文献、Webページなどに記載されているようなサンプルコードも、当該部分を変更しなければ、実行不可能になる。

また、new graphics modeでは、old graphics modeと異なり、オブジェクト指向の手法が導入されているため、x*()形式の名称の関数をnew graphics modeの関数に単に置換するだけでは、意図する描画を行えない。

new graphics mode では、描画した図は木構造データとして管理される。たとえば、次のようにして円を描くと、
t = 0:0.01:2*pi;
x = sin(t);
y = cos(t);
plot2d(x, y);
次のような木構造が作成される。
Figure
  |
  +--Axes
       |
       +--Compound
            |
            +--Polyline
ここでFigure、Axes、Compound、Polylineはオブジェクトの種類を表す。
Figure
ルートノードにあたるオブジェクト。ウィンドウに対応する。
Axes
水平および垂直軸を表すオブジェクト。
Compound
複数のオブジェクトをまとめて扱うためのオブジェクト
Polyline
連続線分を表すオブジェクト。上記の図の場合、円に相当する。
これらのオブジェクトはScilabのオンラインヘルプでは"graphics entities"と総称されている。"entity"は外来語としてはあまり人口に膾炙していないと思われるので以下では単にオブジェクト、あるいは描画オブジェクトと呼ぶ。

各オブジェクトには所有設定項目(property)があり、それを変更すると図に反映される(propertyはC++におけるメンバ変数、Javaにおけるフィールドに相当する)。たとえば、表示中のウィンドウのタイトルを変更は次のように行う。
hf = gcf();
hf.figure_name = "Circle with perimeter of PI";
ここでgcf()は現在のウィンドウに対応するFigureオブジェクトへのハンドルを返す関数であり、figure_nameはウィンドウのタイトルに対応するFigureオブジェクトの設定項目である。

オブジェクトへのハンドルを用いて、オブジェクトの設定項目の一覧を参照できる。たとえば、上記のhfを用いて、
hf
(";"がないことに留意)と入力すると、次のように表示される。
 hf  =

Handle of type "Figure" with properties:
========================================
children: "Axes"
figure_style = "new"
figure_position = [132,132]
figure_size = [441,437]
axes_size = [441,437]
auto_resize = "on"
figure_name = "Circle with perimeter of PI"
figure_id = 0
color_map= matrix 32x3
pixmap = "off"
pixel_drawing_mode = "copy"
immediate_drawing = "on"
background =  -2
visible = "on"
rotation_style = "unary"
user_data = []

ここで注目したい設定項目はchildrenである。childrenは木構造上での子ノードへのハンドルの配列であり、Figure、Axes、Compoundはいずれも子ノードを持つことができる。したがって、木構造中の子ノードに相当するオブジェクトの設定項目の変更はこのchildrenを介して、オブジェクトへのハンドルを得て、行う。たとえば、円に相当するPolylineの線の太さの変更は次のように行える。
ha = hf.children(1);
hc = ha.children(1);
hcrc = hc.children(1);
hcrc.thickness = 4;
これを、次のようにまとめて書くこともできる。
hcrc = hf.children(1).children(1).children(1);
hcrc.thickness = 4;

ScilabのオンラインヘルプをWebブラウザで読む

Windowsの場合:
ScilabをC:\Program Files\scilab-4.1.2にインストールしたとすると,
次のローカルディスクのURLにアクセスする.
 file://localhost/C:/Program%20Files/scilab-4.1.2/man/eng/contents.htm
ただし,Scilab 4.1.2ではcontents.htm中のリンクの記述が誤っている(理由不明)
ので,その修正が必要である.その修正はCygwin上であれば次のように行える.
cd "C:\Program Files\scilab-4.1.2\man\eng"
cp contents.htm backup
sed -e"s/D:.*eng/./g" backup > contents.htm
ここで行っている処理はHTMLファイルcontents.htm中の"D:"で始まり,"eng"
で終わる文字列を全て"."で置き換える処理である.
最終更新:2009年05月23日 22:25
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。