環境


基本

大文字・小文字

IDLは大文字と小文字とを区別しない。

起動

idl
idlde &

プロシジャの作成

  • ファイル名はhoge.pro
    pro hoge
     処理
    end
  • 実行はIDLプロンプト
    .run hoge
    hoge
  • コマンドラインレベルでの命令実行と、各プロシージャ区別する。

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

;コメントアウト
&一行に弐つの命令を書く
$一行に収まらないときに、
STOPそこで中断。.continue or .cで復帰。
RETURNそこで終了し、コマンドラインに戻る。メモリは消去

画像描画の原点変更

通常IDLでは、TVコマンドで画像を見た場合、絵が上下逆転で表示される。

これはIDLの描画原点が左下に設定されていることに起因する。これは以下のコマンドで解消できる。

  • 左下を原点にする。
    !Order=0 
  • 左上を原点にする。
    !Order=1

演算子

'<','>'の扱いがC言語等のそれとは大幅に違う。 使わない方が吉。

+加算
-減算・符号反転
*掛け算・ポインタ
/割り算
<データの大きいほうを選ぶ
>データの小さいほうを選ぶ
^乗算
##行列の掛け算
MOD割った余り

大小の判定には以下を使うべし。

EQequal:等しい
NEnot equal:等しくない
GEgreater than or equal to:以上
LEless-than or equal:以下
GTgreater than:〜より大きい
LTless than:〜より小さい

論理演算子

AND&
OR||
NOT!

ループ

Forループ

for i=0,100 do begin
処理
endfor

Reapeatループ

Repeat begin
処理
endrep until(i eq 100)

条件文

If,Elseによる分岐

if(i lt 100) then begin
処理
endif
if(i lt 100) then begin
 処理
endif else begin
 処理
endelse

open file with GUI

file=dialog_pickfile()

テキストデータの書き込み

file = 'tets.txt'
openw, 1, file
printf, 1, format='(2f10.5)', x, y
close, 1

「1」は適当に割り当てたは理論ユニット番号で、 以降このファイルはこの理論番号で参照される。

ショートカット(IDLWAVE)

 IDLWAVEはIDLをemacs上で動かすプログラム。emacs使いならとっても (゚д゚)ウマー

通常

C-c C-sIDLコンソールを表示
C-c C-dIDL関連に「C-」を追加
C-c C-d C-cSave and .RUN
Save and .compile
C-c C-d C-xGoto next error
C-c C-d C-wUpdate Working Dir
C-c C-d C-tToggle tool bar
C-c C-d C-zReset IDL
C-c C-d C-qExit IDL

デバッグモード

Break Point Setting and Clearing

bSet breakpoint ([C-u b] for conditional, [C-n b] nth hit, etc.).
dClear nearby breakpoint.
aClear all breakpoints.
iSet breakpoint in routine named here.
jSet breakpoint at beginning of containing routine.
\Toggle breakpoint disable
]Go to next breakpoint in file.
[Go to previous breakpoint in file.

Stepping, Continuing, and the Stack

s or SPACEStep, into function calls.
nStep, over function calls.
kSkip one statement.
mContinue to end of function.
oContinue past end of function.
uContinue to end of block.
hContinue to line at cursor position.
rContinue execution to next breakpoint, if any.
+ or =Show higher level in calling stack.
- or _Show lower level in calling stack.

Examining Expressions (with prefix for examining the region)

pPrint expression near point or in region ([C-u p]).
?Help on expression near point or in region ([C-u ?]).
xExamine expression near point or in region ([C-u x]) with letter completion of the examine type.
ePrompt for an expression to print.

Miscellaneous

qQuit - end debugging session and return to the Shell's main level.
vTurn Electric Debugging Mode off (C-c C-d C-v to return).
tPrint a calling-level traceback in the shell.
zReset IDL.
C-?Show this help menu.

ショートカット (idlde)

終了Ctrl+q
保存Ctrl+s
コンパイルCtrl+F5
実行F5
BreakCtrl+c
StopCtrl+r
undoAlt+z

変数宣言

壱変数

  • 整数
    x=0
  • 32bit整数
    x=0l
  • 単精度実数
    x=0.
  • 倍精度実数
    x=0.d0
  • 文字列
    x='mojiretu'

配列

大きさn。次元を増やすことも可「n」->「n,m」

  • 整数
    x=intarr(n)
  • 4byte整数
    x=longarr(n)
  • 8byte整数
    x=long64arr(n)
  • 単精度実数
    x=fltarr(n)
  • 倍精度
    x=dblarr(n)
  • 文字
    x=strarr(n)
  • 要素が全て「x」でn1 x n2の配列の宣言
    arr=replicate(x,n1,n2)

続き番号配列

  • 整数
    x=indgen(n)
  • 実数
    x=findgen(n)
  • 倍数度実数
    x=dindgen(n)

変数の削除

delvar, x

配列の結合

a=array[10,20] b=array[10,20]

  • c=array[20,20]
    c=[a,b]
  • c=array[10,40]
    c=[[a],[b]]
  • c=array[10,20,2]
    c=[[[a]],[[b]]]

型変換

  • 整数へ
    x=long(x)
  • 単精度へ
    x=float(x)
  • 倍精度へ
    x=double(x)

関数・演算

通常算術

  • 自然対数(e)
    y=alog(x)
  • 常用対数
    y=alog10(x)
  • 絶対値。複素数も可。
    abs(x)
  • ルート(負の値には-NaNを返してエラー)
    sqrt(x)
  • 複素共役
    conj(x)

配列

  • 転置行列
    transpose(a)
  • 逆行列
    invert(x)
  • determinant
    determ(x)
  • 配列の「全要素」を二乗
    arr^2
  • 配列の「全要素」を二倍
    2*arr
  • 配列の「全要素」に+2する
    arr+2
  • 配列要素で、100以上のものを全て100にする
    arr = arr < 100
  • 配列の要素の和を求める。ある次元nに沿って求めることも可
    total(arr)
    total(arr,n)
  • traceを計算
    trace(arr)
  • 配列要素の最大・最小を求める
    min(arr)
    min(arr,max=max)
    max(arr)
  • 配列(arr)の中である条件(arr gt 100)に合う要素の番号(b:vector)と、数(c)を出力。
    b=where( arr gt 100, c)
  • 配列(arr)の中で最大の値を持つ要素を調べる
    print, where( arr eq max(arr) )
  • 要素番号(の配列)(b)を使って、ある配列(arr)から特定の要素(c)だけ抜き出す
    c=arr[b]
  • 配列(arr)の要素数を得る。配列が定義されてなければ零。
    n_elements(arr)
  • 配列(arr)を調べる
    size(arr)
    戻り値:次元数、一次元の要素数、二次元の要素数、・・、型コード、全要素数
  • 配列を切り出す
    e = arr[100:200,200:300]
  • 配列を回転(1=CCW 90度)
    e = rotate( arr,1)
  • 配列のリサイズ
    a = congrid( maroon_bells, 35, 45)

関数・配列()[]

IDLは配列にアクセスするとき、[]だけでなく()も使えるという理解不能な仕様になっている。 例えばaという配列があったとき、b=a[10] も b=a(10) も同じ結果になる。 でも、()を使うと、aが関数なのか配列なのか区別ができません。IDLが関数を配列と誤認してしまってコンパイルができないときは、FORWARD_FUNCTIONを使って「これは関数だ」と宣言する。

function test1, x
  forward_function test2  ; test2は関数である、と宣言する
  return, test2(x,/keyword)
end

普段から関数には()、配列には[]と使い分けておく。

plot

windowを削除

wdelete

windowを消す

erase

カラーで表示

device, decompose=0
loadct, 26
xloadct

eps file

set_plot, 'ps'
device, filename='hoge.eps', /color, /encapsulated, xsize=12, ysize=12, [/landscape]
作図コマンド
device, /close
set_plot, 'x'

Plot image

Extracting Profiles

profiles, nyny

window size

window, 0, xsize=800, ysize=600

TV

  • 自動スケーリングなし
    tv, im
  • 自動スケーリングあり
    tvscl, im

閾値

  • 閾値以上なら1、それ以外は零
    tvscl, im gt 140
  • 閾値以下なら1、それ以外は零
    tvscl, im lt 140 
  • 閾値以上ならそのまま、それ以外は閾値に
    tvscl, im > 200
  • 閾値以下ならそのまま、それ以外は閾値に
    tvscl, im < 200
  • 閾値以上以下
    tvscl, im>140<200

Smoothing and Sharpening

  • display image smoothed using a 7 by 7 area
    tvscl, smooth(nyny, 7)

Unsharp Masking

tvscl, float(nyny)-smooth(nyny,7)

Sharpening Images with Differentiation

  • Roberts gradient
    r = roberts(nyny)
    tvscl, r
  • Sobel sharpened
    so = sobel(nyny)
    tvscl, so

Live Image

live_image, nyny

Surface plot

  • surface plot
    surface, im
  • surface plot[view point指定]
    surface, im, ax=70, az=25
  • surface plot with shade
    shade_surf, im
  • surface plot[view point可変]
    xsurface, im
    「xsurface」でviewpointを好きにできます。
  • BYTSCL
    shade_surface, a, shade=bytscl(a)
  • live surface
    live_surface, a

Contour plot

  • contour plot
    contour, im
  • contour plot with nlevels
    contour, im, nlevel=10
  • contour plot with nlevels c_labels
    contour, a, nlevels=8, c_labels=[0,1]
  • fill contour plot
    countour, a, nlevels=8, /fill
  • fill contour plot with downhill
    contour, a, nlevels=8, /overplot, /downhill

SHOW3

Create a plot that shows a two-dimensional array as an image, wire-frame surface, and contour simultaneously

show3, a

Map

  1. Read worldelv.dat:
    elv = read_binary('/usr/local/rsi/idl/examples/data/worldelv.dat', data_dims=[360,360], data_type=1)
  2. Load color table:
    loadct, 26
  3. View the data as an image:
    tv, elv
    カラー表示のために
    device, decompose=0
    elv.png
  4. Shift the array 180 elements(columns):
    elv=shift(elv, 180, 0)
    elv180.png
  5. Create a Mollweide projection with continents and gridlines:
    map_set, /mollweide, /cont, /grid, color=100
  6. Warp the image using bilinear interpolation and save the result in the variable new:
    new = map_image(elv, sx,sy,/bilin)
  7. Display the new image:
    tv, new, sx,sy
    elv_moll.png

ERROR

Loop limit expression too large for loop variable type.

The default type for integers in IDL is a "short" or 16-bit integer, which can only go from -32768 to 32767. The quick fix is to put an "L" at the end of your numeric constants to promote them to "long" 32-bit integers.

for i = 0L, NMAX-1 do begin ...

Note the "0L" instead of "0".

球面調和関数

球面調和関数の挙動がおかしい。

どうもl>150ぐらいから計算結果がおかしい。

直行関係

spher_har_orth1.png

解決方法

原因
spher_harm( theta, phi, l, m)の変数の精度の問題?。例えばl=m=300でも、theta=phi=!piなら零、エラーなし。でも・・・・

lが大きな所での計算精度をIDLに期待してはいけない、で結論?

添付ファイル: filespher_har_orth1.txt 952件 [詳細] filespher_har_orth1.png 1149件 [詳細] fileelv_moll.png 1144件 [詳細] fileelv180.png 1140件 [詳細] fileelv.png 1217件 [詳細] filerow_column_idl.png 1070件 [詳細] filematrix_neta.png 1012件 [詳細] filerow_column.png 1000件 [詳細]