関数内で変数を読み込むときの予期しない結果
MAT ファイルからデータを読み込む関数があり、MATLAB® で期待どおりの結果が返されない場合、MAT ファイルのいずれかの変数の名前が MATLAB 関数と同じになっていないか確認してください。関数名と競合する一般的な変数名には、i
、j
、mode
、char
、size
、path
などがあります。
このような予期しない結果は、関数を実行する際、MATLAB が実行前に関数内のすべてのコードを事前処理するために発生します。しかし、load
の呼び出しは事前処理されません。これは、MATLAB は MAT ファイル内の変数についての情報を持っていないという意味です。したがって、MATLAB 関数と同じ名前の変数は MATLAB 関数として事前処理され、予期しない結果を引き起こします。これは、コマンド ウィンドウのように MATLAB が行ごとに事前処理して実行するスクリプトと異なる点です。
たとえば、変数 height
、width
、および length
を含む MAT ファイルについて考えます。これらの変数を findVolume
などの関数に読み込む場合、MATLAB では length
への参照は MATLAB 関数 length
の呼び出しであると解釈され、エラーが返されます。
function vol = findVolume(myfile) load(myfile); vol = height * width * length; end
length を使用中のエラー 入力引数が不足しています。
エラーが発生しないようにするには、関数を定義する際に以下の方法のいずれかを選択します (複数可)。
構造体配列に変数を読み込みます。以下に例を示します。
function vol = findVolume(myfile) dims = load(myfile); vol = dims.height * dims.width * dims.length; end
関数
load
の呼び出しに変数名を明示的に含めます。以下に例を示します。function vol = findVolume(myfile) load(myfile,'height','width','length') vol = height * width * length; end
load
を呼び出す前に関数内で変数を初期化します。変数を初期化するには、変数を空の行列または空の文字ベクトルに代入します。以下に例を示します。function vol = findVolume(myfile) height = []; width = []; length = []; load(myfile); vol = height * width * length;
特定の変数名が MATLAB 関数と関連しているかどうかを判断するには、関数 exist
を使用します。戻り値 5 により、名前が MATLAB の組み込み関数であることが示されます。