IDLの使い方

Reference Guide等のマニュアルはこちらからダウンロード可
 
ここでの表記の目安
 全部大文字:IDLに固有の命令
 頭文字だけ大文字:キーワード(プロシージャでの説明を参照)
 全部小文字:変数

特殊記号、プロシージャの実行

 プロシージャとは、一まとまりのコマンド列(フォートランでのメイン・プログラムやサブルーチン)のこと。

;
その後の文字はコメント扱い。
a=1 ; note
&
1行に2つの命令文を書く
a=1 & b=2
$
文が次の行に続く
STOP
そこで中断。変数などはそのまま。IDLDEを使っていれば、STOPの代わりにbreakpoint(赤丸)を置いたらよい。
RETURN
そこで終了してコマンドラインに戻る。メモリは消去される。呼ばれたプロシージャの中にあれば親のプロシージャに戻る。
MESSAGE,str
文字strを出力してそこで中断。,/Continueでそのまま継続。

変数の宣言

組み込み関数

複素変数aから実数部分ar・虚数部分aiだけを取り出す
ar=REAL_PART(a)
ai=IMAGINARY(a)

文字

文字変数から整数を読み出す
n=0l
READS,c,n,format='(x5,i3)'
文字変数cから5文字スキップして、3文字の整数を読んでnに入れる。nを定義しておかないと型がデフォルトの単精度実数になる。

フローチャート制御

配列演算

配列の結合
c=[a,b]
 aとbが10×20の配列の場合、cは20×20の配列となる。
c=[[a],[b]]
 cは10×40の配列となる。
c=[[[a]],[[b]]]
 cは10×20×2の配列となる。
転置行列
TRANSPOSE(a)
フーリエ変換
b=FFT(a)
 1次元配列aのフーリエ変換bを返す。値は1/nされてる。
逆フーリエ変換
a=FFT(b,1)
 1次元配列bの逆フーリエ変換aを返す。

入出力

グラフを描く

横軸の目盛りの文字(値)を書かない
,Xtickname=REPLICATE('空白',60)
横軸の目盛り自体を書かない
,Xminor=1,Xticks=1,Xtickname=['空白','空白']
注意:Xticknameの''の間に空白を入れないと、値が書かれる。
負の値の等値線に点線を用いて、等値線図を描く。
levels = FINDGEN(60) - 30.
cl= REPLICATE(0,60)
cl[ WHERE( levels lt 0 ) ] = 1
CONTOUR,a,Levels=levels,C_linestyle=cl
カラーコンターを色々と試してみる。
DEVICE,Decomposed=0
XLOADCT
色表が出現するのでスライダー等をいろいろいじると、即座に色表が変更される。

その他の描画

棒グラフ
PLOT,FINDGEN(10),Yrange=[0.,MAX(d)],/Nodata
BAR_PLOT,d,Barnames=barnames,/Overplot
Barnames:それぞれの棒に関する名前、d:値。
BAR_PLOTはAXIS用のキーワードが使えないので、まずPLOTで枠を描いてから呼ぶ。
(x0,y0)から(x1,y1)への矢印を描く
ARROW,x0,y0,x1,y1
使用できるパラメータ
Data:1にすると軸座標(既に描かれている縦軸・横軸の値で座標を指定)、デフォルトは標準座標(画面の左下が(0,0)、右上が(1,1))
Hsize:頭のサイズ、負の値で指定するとよい
座標を示すx0,y0,x1,y1は、同じ長さの1次元配列でも可

ポストスクリプトファイルに出力

出力先をx-windowからpsファイルに変更
SET_PLOT,'PS'

プロシージャ

プロシージャtestを定義する
PRO test,a
a=2.0*a
END
以上3行をtest.proというファイル名で、現在作業している(またはパスを通した)ディレクトリに保存する。次のように呼ぶ。
test,a
Fortranで言うところの引数を、IDLではパラメータと呼ぶ。このプロシージャではaがパラメータ。パラメータはなくても良い。
キーワードを用いる
プロシージャの1行目を次のようにしてtest.proというファイル名で保存。
PRO test,Keyword1=c,Keyword2=d
次のように呼ぶと、プロシージャ中の変数cにbの値が引き渡される。
test,Keyword1=b
プロシージャを呼ぶときに、キーワードは指定しなくても良い。
キーワードの値の特殊な与え方
上記のプロシージャtestを次のように呼ぶと、プロシージャ中の変数cには1が引き渡される(フラッグが立つ)。
test,/Keyword1
様々なキーワードをプロシージャ中でさらに呼ばれる他のプロシージャに引き継ぐ
次のようなプロシージャでは、Keyword1という名前以外のキーワードは全てextra_keywordsに入り、PLOTを呼ぶときに使われる。
PRO test,Keyword1=c,_extra=extra_keywords
PLOT x,_extra=extra_keywords
END
関数testを定義する
FUNCTION test,a,b,Keyword1=c
 〜計算プログラム
RETURN, o
END
上記の内容でtest.proに保存する。次のように呼ぶと結果がoに入る。
o=test(a,b,Keyword1=c)
IDLLEでプロシージャを探すディレクトリを設定する(パスを通す)
ウィンドウの上にあるバーの中のFile-Preferences-Pathsでディレクトリを指定。またはホームディレクトリの.idldeというファイルを編集。

3D

3次元描画空間の準備
scale3
 パラメータ:xrange,yrange,zrange,ax(x軸に対しての視線角度),az(z軸に対しての視線角度)
浮いたコンターを用いて描く。
contour,a,/t3d
コンター絵をz面に描く。
contour,a,/t3d,zvalue=0.
 zvalue(0から1)によってコンター絵を描く位置を指定する。
コンター絵をx面やy面に描く。
t3d,/yzexch(またはt3d,/xzexch)
contour,a,/t3d,zvalue=0.
 コンターを描く前にy軸とz軸を交換、もしくはx軸とz軸を交換しておく。
ヴォリューム・レンダリング
shade_volume,d,value,v,p,low=low
tv,polyshade(v,p,/t3d)
 ここでdはデータの3次元配列、valueは等値面を描く値。low=0ならvalueより値が大きい領域が囲まれ、1なら小さい領域が囲まれる。
x,y,z軸は配列dの要素番号そのまましか使えないため、scale3の範囲をdのサイズで指定しておく必要がある。

システム変数


IDLでオブジェクト指向

 'OBJECTS AND OBJECT GRAPHICS IDL V.5'のChapter.2を簡単にまとめる。

クラスとインスタンス

クラスの定義

PRO Class1__Define
struct = { Class1 ,data1:0l,data2:fltarr(10),data3:'' }
END
 上の内容をclass1.proに保存してコンパイルする。名前つき構造体の定義なので、この定義を変更するためには一度idlを閉じなければならない。配列の大きさの指定には変数は使えない?

サブクラスの定義

PRO Class2__Define
struct = { Class2 ,data4:0.0,INHERITS Class1}
END
以上をClass2.proに保存しコンパイル。これでClass1.pro内のメソッドも継承する。メソッドや変数は上書きができる。

インスタンスの生成

a = OBJ_NEW('Class1')
aがClass1というクラスのインスタンスとなる。初期値はInitという(ライフサイクルの)メソッドの中で指定できるとあるが使えず、変数はすべて0.、文字変数は空白となる。またこのインスタンスの前にclass1.proをコンパイルしておかなければならない。ファイルの自動検索はできなかった。

メソッド

メソッドの定義

PRO Class1::Print1
PRINT,self.data1
END
 上のような内容のプロシージャをclass1.proに書いてコンパイルする。selfはメソッドを実行するインスタンスを指す。

メソッドの実行

 実行は下のようにインスタンスとメソッドを指定する。
a -> Print1

引数の引渡し

 基本的にはキーワードで引き渡すことにする。
PRO Class1::SetData1,MyData=MyData
self.data1=MyData
END
というメソッドを定義しておき
a -> SetData1,MyData=2
で実行するとa.data1に2が入る。

スーパークラスのメソッドの実行

 あるメソッドの中で、同じ名前のスーパークラスのメソッドを使用するには、クラスの名前を指定すればよい。
PRO Class2::Print1
self -> Class1::Print1
END
実際にはこのようなメソッドを定義する必要はない。Print1というメソッドがClass2になければ、スーパークラスであるClass1のメソッドを自動的に検索する。