Main Content

MATLAB コードの透過性

MATLAB® で、コメント、文字ベクトル、string リテラルを無視してコードをスキャンすることにより変数へのアクセスをすべて識別できる場合、コードは "透過的な変数アクセス" をもっています。変数アクセスには、ワーク変数の読み取り、追加、削除、変更が含まれます。

次のようなコーディングのコンテキストで、MATLAB は透過的な変数アクセスを必要とします。

このようなコンテキストにおいて、非透過的な変数アクセスは実行時エラーにつながります。

透過的なコードの記述

透過的なコードでは明示的に変数名を参照します。たとえば次のコードで、MATLAB は Xii を変数として識別できます。

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 がコードを実行して Xii を変数として識別しなければならないことを意味します。

以下に、透過的な変数アクセスで使用できない関数とコーディングの部分リストを示します。

  • evalevalcevalin または assignin

  • スクリプト

  • たとえば mexGetVariable を使用することで、ワークスペース変数に動的にアクセスする MEX 関数

  • whowhos などのイントロスペクティブな関数

  • save および load コマンド (ただし、load からの結果が明示的に代入される場合を除く)

  • 任意の動的な名前参照

コマンド形式を使用して変数を関数に渡すことは、引数を文字列として渡すことと等価であるため、透過的ではありません。たとえば、以下の関数 clear の呼び出しは、どちらも非透過的です。

clear X
clear('X')

コードがワークスペース変数を作成し、コードの実行後にのみこれらの新しい変数を MATLAB が識別できる場合、そのコードの変数アクセスは透過的ではありません。たとえば、MATLAB は MAT ファイルから読み込まれる変数を特定できないため、次のステートメントは非透過的です。

load foo.mat

しかし、読み込まれた変数を明示的に名前に割り当てるコードは透過的です。これは、MATLAB は左辺の名前がワークスペース変数を参照することを認識できるためです。たとえば、次のステートメントは、MAT ファイルの変数 X を、ワークスペースの X という名前の変数に読み込みます。

X = load('foo.mat','X');

変数へのアクセスは、ワークスペース内で透過的でなければなりません。たとえば、コードでは、透過性が必要なワークスペースにある関数 evalin または assignin を使用して、別のワークスペース内に変数を作成することはできません。

関連するトピック