プログラミング

【Igor Pro】プログラミングにおける変数について解説【macro】

こんにちは、くろがきです。

Igor Proのプログラミングにおける変数についてまとめていきます。

Igor Proのプログラミングでは大きく分けて「3つの変数」と「変数的に使えるもの」があります。

  1. システム変数
  2. ローカル変数
  3. グローバル変数
  4. 変数のように使えるもの(wave, structure)

順番に解説していきます。

①システム変数

K0, K1, …, K19の20個のシステム変数があって、主にカーブフィッティングで使われています。

マニュアルでも、通常用途においてはあまりシステム変数の使用を推奨していないようです。

System variables are built in to Igor. They are mainly provided for compatibility with older versions of Igor and are not recommended for general use.

Igor Pro Manual

②ローカル変数

Igor Proでのプログラミングにおいて最もよく利用する変数。

変数は2種類で、「Variable(数値)」と「String(文字列)」です。

  • Variable 変数名
  • String 変数名

Variable変数には数値を代入でき、またVariable変数は数値として扱います。

String変数には文字列が代入でき、String変数は文字列として扱うことになります。

つまり、数式中にString変数を書くとエラーになりますし、文字列を結合している最中にVariable変数が紛れ込むとこれもまたエラーになります。

Variable変数とString変数は簡単に変換できます。

変換には次のビルトイン関数を使います。

  • num2str(数値→文字列)
  • str2num(文字列→数値)

実はIgor Proの変数において、pとxは特別な変数というより、関数です。

p1次元waveの行番号を返します。

x1次元waveの行番号を返す関数ですが、その値をスーケルすることができます。

例えば、適当なwaveを作りたいとき、

Make/N=100/O w=p

とすると、0〜99までの100個の整数値を持つwaveが簡単に作れます。

ですが、もう少し複雑なwaveを作りたいとき、

Make/O/N=100 w
SetScale x 0, 2*PI, w
w = sin(x)
Display w

とすることで、xの範囲を[0, 2π]としたwaveを作ることができます。

もしxをスーケルし忘れると、pのときのようにxの範囲は[0,99]となってしまい、数周期分ものサインカーブが描かれる結果となってしまいます。

こうした一文字関数は、xとp以外にy, z, q, rがあり、それぞれ2次元ウェーブ、3次元ウェーブで使います。

③グローバル変数

ある程度規模の大きなプログラミングをするときに、グローバル変数を使うと便利です。

  • Variable/G 変数名 or 変数のフルパス
  • String/G 変数名 or 変数のフルパス

上記のように記載すると、グローバル変数を定義できます。

グローバル変数を呼び出すときは下記のようにします。

  • NVAR 変数名 = グローバル変数のフルパス
  • SVAR 変数名 = グローバル変数のフルパス

グローバル変数はいつ使うのか。

それは変数の値を記憶したいときです。

基本的にローカル変数の寿命は、定義された場所から、その関数が終わるところまでです。

例えば、ある関数で定義した変数を別の関数で利用したいとなったとき、通常の変数では対応が難しくなります。

そんなとき力を発揮するのが、グローバル変数。

グローバル変数は一度定義すると、データフォルダ内に保持されて、上書きしたり、そのエクスペリメントファイルを終了しない限り、残り続けます

そのため、NVARやSVARで変数の正しいパスを記載しさえすれば、どのような状況からでも変数を利用できるようになります。

例えば、グローバル変数にカーソル位置を記録したり、フラグを立ててその結果を記録したり、といろんなことに使えます。

またIgor Proの場合、グローバル変数はデータブラウザに表示されるので、変数が可視化できるという点でプログラムの見通しが良くなります。

データブラウザに表示されたグローバル変数は、ダブルクリックすると編集可能なのでテスト的に変数を変更したいときにも便利です。

とはいえ、グローバル変数を使いすぎると処理が重くなりますので、使用は最低限に留めるほうがよさそうです。

【Igor Pro】グローバル変数とローカル変数の処理速度を検証 こんにちは、くろがきです。 Igor Proでプログラミングする中で、ある程度大きなマクロを組む際に、グローバル変数とローカル変...

Igro Proのビルトイン関数でもよくグローバル変数は使われています。

例えば、数値データをロードするとロードしたディレクトリ内にファイルパスが記載されたグローバル変数が現れます。

グローバル変数さえ使えば、プログラムを書くうえではほとんど困ることはなくなると思います。

④変数のように使えるもの(wave, structure)

ローカル変数とグローバル変数以外にも、変数的に使えるものがあります。

まずはwaveです。

一般的にwaveはデータ配列のことで、主に実験データを格納する際に使用します。

waveには次のような特徴があります。

  1. 定義されると、グローバル変数のようにデータフォルダに格納される
  2. 単なる配列としても機能する

そのため、waveに保持したい値を格納していくことで、いつでもアクセスできるグローバル変数のような使い方をすることができます。

waveは数値データだけでなく、文字列も格納することができます。

文字列をwaveに格納したいときは、

make/T ウェーブ名

として、Tオプションであらかじめテキストウェーブを作成する必要があります。

1次元waveの各要素にアクセスするときは、

wave[i] = 数値(iはデータ番号)

のようにします。

2つ目は構造体です。

Igor Proのプログラミングには、オブジェクト指向の概念はありませんが、構造体の概念はあります。

構造体データを圧縮することができるので、これをグローバル変数に書き出しておけば、別の関数から構造体データにアクセスできます。

この構造体の圧縮と解凍には、

  • StructPut
  • StructGet

を使用します。

またボタンアクションなどの構造体は、usedataというところに文字列を保持させることもできるので、これを使って文字列や構造体のデータを保持させることもできます。

まとめ

この記事では、Igor Proの変数の種類について解説しました。

よく利用するローカル変数やグローバル変数以外にも、ウェーブや構造体を使うことで変数をまとめて格納することも可能です。

私の場合、Igor Proでプログラミングをしていると、グローバル変数だよりになる場面が多かったのですが、大量のグローバル変数は管理が大変だったりします。

そのため、ウェーブや構造体をうまく利用して、わかりやすいプログラムを組んでいきたいものです。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です