Igorの解説とか

このブログはWavemetrics社が開発および販売しているIgorについて解説するブログです。

マクロの組み方part7(Waveの作成とdo-whileループ2)

前回の続きです。

前回の内容をdo-whileループを使って書いてみます。 

 

 

do-whileループ
macro makewave_B()
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ループについては

do
  反復させたい内容
while(継続条件)

 の形で用います。

 

ループの流れは下図のとおりです。 

f:id:Igorpro:20170212193444p:plain

 

今回の例では、まず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というコマンドです。

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ループを用いて複数作成することが出来ます。

数が多くなればなるほどループは重要ですので、しっかりマスターしてください。

 

 

目次 サイト目次 - Igorの解説とか

前 マクロの組み方part6(Waveの作成とdo-whileループ1) - Igorの解説とか

次 マクロの組み方part8(マクロの動作を早くする silent 1) - Igorの解説とか