IDLの基礎
このページはSさんのメモをもとにIDLの使用に関する基礎事項をまとめたものです。特に記述がない限り、ページ数はこれを参照しています。
プロシージャとは、一まとまりのコマンド列(フォートランでのメイン・プログラムやサブルーチン)のこと。プロシージャの詳しい使い方についてはプロシージャの詳細にまとめてあります。
;
1変数の宣言
複素変数aから実数部分ar・虚数部分aiだけを取り出す
変数(n)を文字変数(c)にフォーマット'i4'で変換する
ループさせる(※32,767より大きな数字でループをまわす場合には0→0L,im-1→im-1Lなどとすること)
コンターを描く z:2次元配列 x,y:軸の値
線の太さを指定する
軸のカスタマイズ一覧 p.243
contourのカスタマイズ一覧 p.267
contourをカラフルに
棒グラフ
PLOT,FINDGEN(10),Yrange=[0.,MAX(d)],/Nodata
出力先をx-windowからpsファイルに変更
大きく使う(指定できる要素は,Reference Guide(vol.1)p.96に一覧)
3次元描画空間の準備
!x.window
'OBJECTS AND OBJECT GRAPHICS IDL V.5'のChapter.2を簡単にまとめる。
上の内容をclass1.proに保存してコンパイルする。名前つき構造体の定義なので、この定義を変更するためには一度idlを閉じなければならない。配列の大きさの指定には変数は使えない?
以上をClass2.proに保存しコンパイル。これでClass1.pro内のメソッドも継承する。メソッドや変数は上書きができる。
aがClass1というクラスのインスタンスとなる。初期値はInitという(ライフサイクルの)メソッドの中で指定できるとあるが使えず、変数はすべて 0.、文字変数は空白となる。またこのインスタンスの前にclass1.proをコンパイルしておかなければならない。ファイルの自動検索はできなかった。
上のような内容のプロシージャをclass1.proに書いてコンパイルする。selfはメソッドを実行するインスタンスを指す。
実行は下のようにインスタンスとメソッドを指定する。
基本的にはキーワードで引き渡すことにする。
というメソッドを定義しておき
で実行するとa.data1に2が入る。
あるメソッドの中で、同じ名前のスーパークラスのメソッドを使用するには、クラスの名前を指定すればよい。
実際にはこのようなメソッドを定義する必要はない。Print1というメソッドがClass2になければ、スーパークラスであるClass1のメソッドを自動的に検索する。
特殊記号、プロシージャの実行
プロシージャとは、一まとまりのコマンド列(フォートランでのメイン・プログラムやサブルーチン)のこと。プロシージャの詳しい使い方についてはプロシージャの詳細にまとめてあります。
;
その後の文字はコメント扱い。 a=1 ; note&
1行に2つの命令文を書く a=1 & b=2$
文が次の行に続くSTOP
そこで中断。変数などはそのまま。IDLDEを使っていれば、STOPの代わりにbreakpoint(赤丸)を置いたらよい。RETURN
そこで終了してコマンドラインに戻る。メモリは消去される。呼ばれたプロシージャの中にあれば親のプロシージャに戻る。MESSAGE,str
文字strを出力してそこで中断。,/Continueでそのまま継続。
変数の宣言
1変数の宣言
適当な数を代入しておく 整数:n=0 :0lで32bit整数 単精度実数:x=0. 倍精度実数:x=0.d0 文字:c='moji'配列の宣言(大きさm)
整数:n=INTARR(m) 4バイト整数:n=LONARR(m) 8バイト整数:n=LON64ARR(m) 単精度:x=FLTARR(m) 倍精度:x=DBLARR(m) 文字:c=strarr(m)続き番号配列の宣言(整数、実数、倍精度実数)
indgen(m),findgen(m),dindgen(m)要素が全てaでn1*n2の配列arrの宣言
arr=replicate(a,n1,n2)型変換
整数へ: x=LONG(x) 単精度へ: x=FLOAT(x) 倍精度へ: x=DOUBLE(x)
組み込み関数
複素変数aから実数部分ar・虚数部分aiだけを取り出す
ar=REAL_PART(a) ai=IMAGINARY(a)n mod m
nをmで割った余りを求めるexp(a)
e^aALOG(a)
aの自然対数ALOG10(a)
aの常用対数aか100,小さい数字を選ぶ
a < 100ABS()
絶対値を得る(複素変数も可)SQRT()
ルートを得る(負の値には-NaNを返してエラー)
文字
変数(n)を文字変数(c)にフォーマット'i4'で変換する
c=STRING(n,format='(i4)')右側3文字分は、空白の代わりに0を入れる。フォーマット一覧は本p.141。
c=STRING(n,format='(i4.3)')文字変数(c)の中の空白をすべてなくす
c=STRCOMPRESS(c,/remove_all)文字変数(c)の2つ以上続く空白を1つにする
c=STRCOMPRESS(c)2つの文字(c,'plus')を合わせる
c=c+'plus'文字数を返す
STRLEN(c)座標(x,y)に文字cを書く。
XYOUTS,x,y,c :/nomalとすると紙いっぱいに規格化[0.-1.]された座標を使う。左右に寄せる(0.で左寄せ、1.で右寄せ)
keyword:alignment小文字を大文字にする
result=STRUPCASE(string)大文字を小文字にする
result=STRLOWCASE(string)ギリシャ文字や指数などを使う。
TeXtoIDLというプロシージャ群をダウンロードして、パスを通したディレクトリに展開する。 str=TeXtoIDL("\rho^2") XYOUTS,0.5,0.5,str,/normal文字変数から整数を読み出す
n=0l READS,c,n,format='(x5,i3)' 文字変数cから5文字スキップして、3文字の整数を読んでnに入れる。nを定義しておかないと型がデフォルトの単精度実数になる。
フローチャート制御
ループさせる(※32,767より大きな数字でループをまわす場合には0→0L,im-1→im-1Lなどとすること)
FOR i=0,im-1 DO BEGIN ... ENDFOR一行だけループさせる
FOR i=0,im-1 DO ...if文
IF i eq 0 THEN BEGINif文(一行だけ)
...
ENDIF ELSE BEGIN
...
ENDELSE
IF i eq 0 THEN ...CASE文(ある文字変数の内容で実行文を選択)
CASE MyCase OF 'success' : print,'Your command has done successfully!' 'failure' : BEGIN print,'Program failed.' END ELSE : print,'can not judge' ENDCASE ; MyCaseという文字変数の内容で実行文を選択するCASE文(if文における不等式の分岐のように選択)
CASE 1 OF (q ge 2) : print,'Your command has done successfully!' (q le -5) : BEGIN print,'Program failed.' END ELSE : print,'can not judge' ENDCASE ; CASE 1 OFと書く。「または」を入れたいときにはorか|でつなぐ。
配列演算
配列の結合
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を返す。
その他の配列処理
配列arrの要素で、100以上のものをすべて100にするarr = arr < 100配列の要素の和を求める。ある次元nに沿って和を求めることもできる。
TOTAL(arr,n)配列の最小・最大を求める
MIN(arr,max=max),MAX(arr)配列の全要素を2乗,2倍,+2する
arr^2 , arr*2 ,arr+2配列(arr)の中である条件(>20)にあう要素の番号(b)と数(count)を知る
b=WHERE(a gt 20,count)要素番号の配列(b)を使って、ある配列(arr)から特定の要素だけ(c)抜き出す
c=arr[b]配列aの要素数を得る(定義されていなければ0)
N_ELEMENTS(a)2次元以上の配列aの要素数を得る
SIZE(a) [次元数、1次元の要素数、2次元の要素数、…、型コード(本p.69参照)、全要素数]のLONG整数配列を返す。配列のサイズ変更。a(m,1,n)の配列をa(m,n)に。
REFORM(a)
入出力
読みとり用にファイル(filei='test.dat')を開くOPENR,7,fileiunformatデータを読む
データを入れる配列は宣言しておく (d[i]など配列の要素に直接入れることはできない。整数はlongで宣言しておく) OPENR,7,filei,/f77_unformatted VPPなどbig_endianのデータは,/swap_if_little_endianをつける READU,7,dformatデータを読む
formatの書き方はfortranとほぼ同じ (practical IDL programming p.141) READF,7,d,format='(8f7.3)'ファイルを閉じる
CLOSE,7書くためのファイル(fileo)を開く
OPENW,8,fileounformatデータを書く
WRITEU,8,dformatデータを書く
PRINTF,8,d,format='(8f7.3)'
グラフを描く
横軸の目盛りの文字(値)を書かない
,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 色表が出現するのでスライダー等をいろいろいじると、即座に色表が変更される。
コンターを描く z:2次元配列 x,y:軸の値
CONTOUR,z(,x,y)フォントの指定。
,font=0(デフォルトは-1)-1:線で表現、0:device font,1:TrueType font
線の太さを指定する
,thick=2.0(デフォルトは1.0)画面を2*3に分割する
!p.multi=[0,2,3]横軸の目盛りの長さを変更する
,xticklen=0.02(マイナスは外に伸びる)横軸の目盛りの文字を文字配列(c)で指定する
,xtickname=c横軸の目盛りの数(n)を指定する
,xticks=n横軸の目盛りの値(v)を指定する(xticknと併用する)
,xtickv=v横軸の小さい目盛りの数(n)を指定する
,xminor=n上軸を描かない
,xstyle=8横軸を描かない
,xstyle=4軸いっぱいに描く(styleは数字を足すことで効果を重ねられる)
,xstyle=1コンターやプロットに重ねて上軸だけを描く
AXIS,xaxis=1中央に横軸を描く
AXIS,0,0,xaxis=0色を変える
1.カラーテーブルの番号を指定する方法 loadctなどでカラーテーブルを指定しておいて color=255 2.BGR(青・緑・赤)で指定する方法(PSには使えない)。device,/decomposedで直接に色を扱えるモードにしておいて以下のパラメータで。xlは「文字変数を整数に変換する」という意味。 color='00ffff'xlplotのカスタマイズ一覧 p.242
軸のカスタマイズ一覧 p.243
contourのカスタマイズ一覧 p.267
contourをカラフルに
ログインシェルに「source /usr/local/rsi/idl_5.2/bin/idl_setup」を加える idlを起動LOADCT,39
39番目のカラーテーブルをロードCONTOUR,a,/fill
39番目のカラーテーブルでコンターを塗りつぶす(うまくいかないときは/cell_fill)横軸・縦軸はそのままでコンターを重ねて描く
contour,a,/overplot横軸・縦軸はそのままで折れ線を重ねて描く。
OPLOT,(x,)y横軸・縦軸を変えて、コンターや折れ線を重ねて描く。
contour,a,/noerase または plot,x,y,/noeraseウィンドウの背景の色を白にし、画像の色を黒にする
,background=(!d.table_size -1), color=0
その他の描画
棒グラフ
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'
大きく使う(指定できる要素は,Reference Guide(vol.1)p.96に一覧)
DEVICE,xsize=19.5,ysize=24.5,xoffset=1.,yoffset=1.横に使う(はじめから全面使用)
DEVICE,/landscape出力終わり
DEVICE,/close出力ファイル名(filename)を指定する
DEVICE,filename=filename device fontの指定(helvetica,times,palatino等)、plot等ではfont=0を指定する必要がある。 DEVICE,/times,/bold
ウィンドウの画面をPNGファイルに書き出す
write_png, 'sample.png', tvrd(true=1)
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のサイズで指定しておく必要がある。
システム変数
!x.window
標準座標(0から1)でのプロット枠(x1,x2)!y.window
標準座標でのy1,y2!d.name
出力先('X'や'PS')自分でシステム変数(!usr_sys)を定義し、初期値をaにする。システム変数はIDLを終了するまで継続する。
DEFSYSV,'!usr_sys',aシステム変数(!usr_sys)が存在しているかを判定する。existが1なら存在、0なら未定義。
DEFSYSV,'!usr_sys',exist=exist
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のメソッドを自動的に検索する。
2009年11月25日(水) 17:38:49 Modified by ID:XE7yMxMyDA
