Tue, November 02, 2004

Igor Pro lecture No. 35

複数ファイルの自動読み込み:LoadWaves(中級)

 今回は、大量のファイルを次々と読み込んで更なる処理を自動的に行うプログラム作成に挑もう。

まずは、ここに用意したファイルをダウンロードしよう。ファイルは zip 形式で、この中には30個のテキストファイルが含まれている。ファイルをテキストエディタで開くとすぐにわかるが、これは緩和スペクトルのようなテストデータだ。第1カラムは緩和時間、第2カラムは強度であると考えてもらったらいいだろう。30個のファイルにはそれぞれ異なる特性時間を有するスペクトルが書き込まれているが、第1カラムの値は30個のファイル全部をとおして全く同じだ。

その次はWindows メニューのProcedure window を開いて、以下のプログラムを入力しよう。

Macro LoadTest()
PauseUpdate
silent 1
loadwave/Q/G/N
variable i=0
do
LoadWave/Q/G/N S_path+S_filename[0, 3]+num2str(i+1)+".txt"
Duplicate/O wave1 $("spec"+S_filename[0, 3]+num2str(i+1))
i+=1
while(i<30)
Duplicate/O wave0 lagtime
killwaves wave0, wave1
end

第8回第10回および第11回の講座で Macro の例を示したが、Macro のはじまりは Macro() で結びは End だ。Macro は IGOR Proのプログラミング入門編としてふさわしいが、プログラムの実行時にコードを一つ一つ解釈して進めるインタプリタ方式で走るので、実行速度はやや遅い。ただ、今回は複雑な計算などを行わないので、高速なコンパイル方式をとるFunctionプログラムについては後日紹介するとして、Macroを使うことにしよう。

とは言え通常の Macro はやはり動作が遅い。プログラムを少しでも速くするためにプログラムの工夫を凝らすことはもちろん大切だが、文頭にちょっとした命令を加えるだけである程度高速化させる事が可能だ。PauseUpdate は、処理結果と一つ一つ表示するのではなく後でまとめてアップデートするための命令で、silent 1は一行一行実行した命令をコマンドラインに表示する事を避けるための命令だ。これらを利用することで処理はかなり高速になる。

さて、プログラムの中心部の解説に移ろう。4行目の loadwave/Q/G/N は第33回で紹介した Load General Text に対応する命令だ。/Qという見たことのないフラッグは、ヒストリーエリアに読み込み結果をプリント表示しないためのオプションだ。それから、ここ文ではパスが指定されていない。パスの表記がない場合、IGOR はユーザーに開きたいファイルの格納場所を訪ねる。本プログラムにおいてこの文は、ユーザーにファイルを開いてもらい、パスを得るのがねらいである。30個のうちどのファイルを選んでも後ほどループ命令で1から30まで全部処理を行うため、この loadwave 文は実はダミーだ。

ループプログラムの作成方法を説明したのは第11回の講座だったろうか。ループカウンタ i を設定して、do - while の間に繰り返し命令を書こう。カウンタに毎回1を足すことも忘れないように。

ループの中身は、(1)LoadWaveと(2)読み込んだ wave のコピーだ。前回の解説では、S_path + S_filename をパスとして利用したが、今回はパスが変わっていくので、少々文字列の操作が必要だ。まずファイル名は必ず「data」で始まっているので、S_filenameのはじめ4文字は共通に用いることができる。0から開始するのがルールなので、S_filename[0,3] だ。続いてファイルの番号がついているので、ここはループカウンタ i を使おう。ただし、i は変数であり、文字列ではないので、i を文字列として取り扱う num2str 関数を利用する。ループは0からはじまっているが、ファイル名は1からなので、i には1を足す。また、ファイル名の最後は拡張子.txtで終わっているので、これも忘れないようにする。

このLoadWaveでは/Nフラッグを使っているため、読み込まれる wave の名前は常に wave0 と wave1だ。よってこれを30回自動で繰り返した場合、30番目のファイルしか得られない。そこで、毎回データを読み込んだら、スペクトルデータである wave1 のコピーを取ろう。また、その名称はファイル番号に対応するように付けたい。specdata1, specdata2, ...とするために、$("spec"+S_filename[0, 3]+num2str(i+1))とした。ドルマークの使い方は第10回で説明したので、忘れた人は再確認すること。wave0 は全ファイル共通なので、ループの外に記述すればよいだろう。複製 wave 名は、lagtimeとした。最後に不要になったwave0 と wave1 は、killwaves で消去して完成だ。

Macrosメニューから早速プログラムを実行して、結果を見てみよう。Windows メニューの New Graph... を呼び出したら、Y wave(s)から30個のspectdataを、X wave から lagtimeを選んでプロットしよう。ちなみにShiftキーを押しながら選択すると複数の wave が選べる。

以下のようなグラフが得られたら成功だ。

posted at November 2, 2004 12:23 AM

« Igor Pro lecture No. 34 | ホームに戻る | Igor Pro lecture No. 36 »

さんのサイン・インを確認しました。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?


Polymer Molecular Engineering Laboratory
Department of Polymer Science and Engineering,
Kyoto Institute of Technology,
Matsugasaki, Sakyo-ku, Kyoto 606-8585, JAPAN