メインコンテンツ

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

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 を使用中のエラー
入力引数が不足しています。

誤った解釈が生じないようにするには、関数を定義する際に以下の 1 つ以上の方法を選択します。

  • 構造体配列に変数を読み込みます。以下に例を示します。

    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*grlength;
    

特定の変数名が MATLAB 関数と関連しているかどうかを判断するには、exist 関数を使用します。戻り値 5 により、名前が MATLAB の組み込み関数であることが示されます。

参考

トピック