マクロの組み方part7(Waveの作成とdo-whileループ2)
前回の続きです。
前回の内容をdo-whileループを使って書いてみます。
Variable i=1
String wavestr
do
wavestr="wave"+num2str(i)
make/N=100/O $wavestr
$wavestr=sin(x*i/30*pi)
i+=1
while(i<=5)
end
とプロシージャウィンドウに打ち込み実行すると、前回と同様の結果が得られると思います。(Waveを全部消してから実行した方が変化はわかりやすいですね。)
まずdo-whileループについては
反復させたい内容
while(継続条件)
の形で用います。
ループの流れは下図のとおりです。
今回の例では、まずi=1からスタートし、do-whileループ内の最後の式i+=1でiを1増やし、i=2にします。
i=2は継続条件i≦5を満たしているので、ループを繰り返し、ループ内最後の式i+=1でi=3になります。
i=3は継続条件を満たしているので・・・
と繰り返していきi=5でループをする際、i+=1でi=6となり継続条件を満たさないのでループ終了となります。
さてループの中身ですが、前回とは異なり、作成するWaveの名前及びsin関数の中身に変数iを含ませる必要があります。
<Variable i=1>
で変数iを定義し、初期値を1に設定します。
<String wavestr>
でwavestrという文字列を定義します。
この文字列はwave名を指定するために用いています。
<do - while(i<=5)>
でdo-whileループをi≦5の条件で行うことを宣言します。
以下ループの中身
<wavestr="wave"+num2str(i)>
wavestrは先で述べた通り、wave名を代入したい、具体的にはwave1,wave2,wave3,wave4,wave5という風にしたいわけです。
つまりwaveは固定で,その後の数字は変数iに対応しているのです。
固定する文字列は""で囲んでやればよく、今回の場合は"wave"とすれば良いです。
wavestr="wave"+i
で良さそうですが、wavestr,"wave"は共に文字列ですが、iは変数ですので、型が違います。
型が違う者同士は足すことは出来ません。
これを解消するために用いるのがnum2strというコマンドです。
ですので、今回の例では
wavestr="wave"+num2str(i)
とすればよいのです。
<make/N=100/O $wavestr>
makeコマンドと/N=100,/Oについては前回を参照。
wave名を $無しのwavestrにしてしまうと、ただ単にwavestrという名前のwaveが作られてしまいます。
文字列wavestrに収納されている文字をwave名として割り当てるためには$wavestrとする必要があります。
この$はwave参照のために用いられる記号です。wave指定については今後詳しく書くつもりです。
<$wavestr=sin(x*i/30*pi)>
$wavestrは上と同じです。
iの値によりsinの中身を変えています。
<i+=1>
i+=1はIgor上でサポートされている代入演算子の1つで
i=i+1
と同意です。
代入演算子についても後ほど書く予定です。
以上で、waveをdo-whileループを用いて複数作成することが出来ます。
数が多くなればなるほどループは重要ですので、しっかりマスターしてください。