Main Content

関数内で変数を読み込むときの予期しない結果

MAT ファイルからデータを読み込む関数があり、MATLAB® で期待どおりの結果が返されない場合、MAT ファイルのいずれかの変数の名前が MATLAB 関数と同じになっていないか確認してください。関数名と競合する一般的な変数名には、ijmodecharsizepath などがあります。

このような予期しない結果は、関数を実行する際、MATLAB が実行前に関数内のすべてのコードを事前処理するために発生します。しかし、load の呼び出しは事前処理されません。これは、MATLAB は MAT ファイル内の変数についての情報を持っていないという意味です。したがって、MATLAB 関数と同じ名前の変数は MATLAB 関数として事前処理され、予期しない結果を引き起こします。これは、コマンド ウィンドウのように MATLAB が行ごとに事前処理して実行するスクリプトと異なる点です。

たとえば、変数 heightwidth、および 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 の組み込み関数であることが示されます。

参考

関連するトピック