MATLAB コードの透過性
MATLAB® で、コメント、文字ベクトル、string リテラルを無視してコードをスキャンすることにより変数へのアクセスをすべて識別できる場合、コードは "透過的な変数アクセス" をもっています。変数アクセスには、ワーク変数の読み取り、追加、削除、変更が含まれます。
次のようなコーディングのコンテキストで、MATLAB は透過的な変数アクセスを必要とします。
関数の引数の検証ブロック。詳細については、変数および関数へのアクセスの制限を参照してください。
parfor
ループまたはspmd
ブロックの本体。詳細については、parfor ループまたは spmd ステートメント内での透過性の確保 (Parallel Computing Toolbox)を参照してください。
このようなコンテキストにおいて、非透過的な変数アクセスは実行時エラーにつながります。
透過的なコードの記述
透過的なコードでは明示的に変数名を参照します。たとえば次のコードで、MATLAB は X
と ii
を変数として識別できます。
X = zeros(1,10); for ii = 1:10 X(ii) = randi(9,1); end
しかし、次の関数 eval
の呼び出しでは、入力が文字列であるため、MATLAB は eval
に渡されるステートメントの変数を認識できません。
X = zeros(1,10); for ii = 1:10 eval('X(ii) = randi(9,1);') end
このコードを実行する前に、MATLAB は、1 つの引数 (文字ベクトル 'X(ii) = randi(9,1);'
) を指定した関数 eval
の呼び出しを認識します。
透過的であるためには、MATLAB が検査または静的解析によって変数を識別できるように、コードは明示的に変数名を参照しなければなりません。文字ベクトル 'X(ii) = randi(9,1);'
を指定して関数 eval
を使用することは、MATLAB がコードを実行して X
と ii
を変数として識別しなければならないことを意味します。
以下に、透過的な変数アクセスで使用できない関数とコーディングの部分リストを示します。
コマンド形式を使用して変数を関数に渡すことは、引数を文字列として渡すことと等価であるため、透過的ではありません。たとえば、以下の関数 clear
の呼び出しは、どちらも非透過的です。
clear X clear('X')
コードがワークスペース変数を作成し、コードの実行後にのみこれらの新しい変数を MATLAB が識別できる場合、そのコードの変数アクセスは透過的ではありません。たとえば、MATLAB は MAT ファイルから読み込まれる変数を特定できないため、次のステートメントは非透過的です。
load foo.mat
しかし、読み込まれた変数を明示的に名前に割り当てるコードは透過的です。これは、MATLAB は左辺の名前がワークスペース変数を参照することを認識できるためです。たとえば、次のステートメントは、MAT ファイルの変数 X
を、ワークスペースの X
という名前の変数に読み込みます。
X = load('foo.mat','X');
変数へのアクセスは、ワークスペース内で透過的でなければなりません。たとえば、コードでは、透過性が必要なワークスペースにある関数 evalin
または assignin
を使用して、別のワークスペース内に変数を作成することはできません。