3

Matlab関数とコマンドウィンドウで同じコードを実行すると、奇妙な動作が見られます。Matlabでのスコープはどのように機能しますか?ですでに説明されています。、しかし、私は自分の特定の問題をどのように解決できるかわかりません。コードは次のとおりです。

exporteddata.m  %File created by an external program 
                %to export data in Matlab format

surface = struct('vertices', [...]) ; 
                         %I can't specify in the external program 
                         %the name of the variable, it's always "surface"

私の実際のコードは次のとおりです。

   myfunction.m 

   function output = myfunction(input)
   load(input);
   n = size(surface.vertices);
  ....

走っているとき

myfunction('exporteddata.m'); 

次のエラーが発生します。

??? クラスhg.surfaceに適切なメソッド、プロパティ、またはフィールド頂点がありません。

コマンドウィンドウから、またはデバッグモードで同じ命令を実行する場合、コードは適切に機能します。

Matlab関数ではなく、ワークスペースに存在する可変サーフェスが必要であることを関数で指定するにはどうすればよいですか?

4

1 に答える 1

3

まず第一にsurface、これは MATLAB の組み込み関数であるため、オーバーロードはただ... 悪いことです。悪い、悪い、悪い

そうは言っても、MATLAB インタープリターは変数名を解決するのに非常にうまく機能し、通常はそれらを関数名と区別して正しく伝えます。それで、あなたの問題はどこですか?
間違った関数を使用していると思います: loadMAT ファイルからワークスペースにデータを読み込む関数です。m ファイルには適していません。"exportedata.m" を適切に実行しないsurfaceと、 が変数として作成されないため、MATLAB はそれを関数名として識別します。「exportedata.m」を実行する場合は、次のように入力します。

exportedata

に保存されているファイル名でファイルを実行する場合はinput、次を使用できますrun

run(input)

run(input)内から実行することによりmyfunction、のローカル スコープでsurface作成され、動作するはずです。myfunction

編集:
私はちょうどそれをテストしましたが、インタプリタはまだ混乱しています。したがって、変数名の解決の問題は残ります。回避策は次のとおりです。

function output = myfunction(input)
   surface = 0;                     %// <-- Pay attention to this line
   run(input);
   n = size(surface.vertices);

事前定義surfaceにより、インタープリターは関数全体でそれを変数として識別できます。私はそれを試してみましたが、うまくいきます。

于 2013-01-28T11:23:25.407 に答える