5

「annotation」と呼ばれる変数の1つおよび組み込みのMATLAB関数「annotation」とMATLAB名が衝突しているようです。

私の関数では、変数アノテーションを含む.matファイルをロードしてから、それを別の関数の引数として使用しようとしています。最小限の作業例は次のようになります。

function test()

    filenames = { 'file1.mat', 'file2.mat', 'file3.mat' };

    for i = 1:numel(filenames)
        in_file = char(filenames{i});
        out_file = strrep(in_file, '.mat', '_out.mat');

        prepare(out_file); % do something with the out file

        load(out_file);  % contains one variable named "annotation"
        which annotation % just to be sure

        other_function(annotation);
    end
end

function prepare(filename)
    annotation = rand(25, 1);
    save(filename);
end

function other_function(annotation)
    whos % just a stub - see whether it has been called
end

ここで、関数prepareで、ファイルに「annotation」という名前の変数が含まれていることを確認しました。これをメイン関数のループにロードすると、「which」コマンドはそれが変数として存在することを通知しますが、other_functionの呼び出しでは、MATLABは関数「annotation」を呼び出そうとします。

注釈は変数です。

??? 71で==>アノテーションを使用中にエラーが発生しました

入力引数が十分ではありません

==>14でのテストのエラー

        other_function(annotation);

プログラムのいくつかの部分で変数名「annotation」を関数呼び出しのパラメーターとしても使用しているため、混乱しています。私が想像できる唯一の説明は、MATLABがどういうわけか私のコードをプリコンパイルするということです-「コンパイル時」では、変数「annotation」は表示されません。ただし、実行時には、「which」コマンドの出力からわかるように検出されます。

どんな助けでも大歓迎です!よろしくお願いします。

注:MATLAB 7.12.0(R2011a)を使用しています。

4

3 に答える 3

2

それは美しくあいまいな問題です!これは、Mathwork側のくだらないデザインです。私はそれをバグと呼ぶことさえあり、彼らが同意するかどうかを見るのは興味深いことです。

簡単な答え:annnotation = 2;コードの行の上の任意の場所に行を追加することで、これを「修正」できますload(out_file);。または、annotation = "roger";またはannotation = false;、コード内で明示的に変数にする限り、アノテーションを作成する変数のタイプは関係ありません。

記述されているコードは、変数を明示的に参照していませんannotationannotation関数のワークスペースにロードするmatlabファイル内の変数の名前です。どういうわけか、これはランタイムエラーをスローしません、それは単に間違って動作します、それは私がバグと呼ぶでしょう、しかしmatlabは文書化された制限であると言うかもしれません。http://www.mathworks.com/help/techdoc/matlab_prog/f4-39683.html#f4-75258でドキュメントを参照し、ご意見をお聞かせください。そのドキュメントはネストされた関数に適用されるようですが、メインの関数は確かにそうではありません。明らかに、あなたのラインは、そのすぐ上に配置されたものと同じスコープでother_function(annotation)表示されるはずです。(私はちょうどそのテストをしました、そしてそれは言います)。annotationwhich annotationannotation is a variable

問題を示す最小限のプログラムを次に示します。

function test()
  prepare('test.mat'); % writes i
  load('test.mat');  % contains one variable named "annotation"

  which annotation
  other_function(annotation);
end

function prepare(filename)
  annotation = 42; % the answer is 42
  save(filename);
end

function other_function(poodle)
  disp(poodle);
end

このページの「バグの報告」リンクを使用して、http://www.mathworks.com/support/bugreportsでバグレポートとしてこれを送信することをお勧めします。よろしければ、報告させていただきますので、お知らせください。

于 2012-05-02T14:19:40.113 に答える
0

これは少し奇妙です!私は同じことを見つけました。基本的に、ワークスペース変数は関数内からスコープ内にあるべきではありません(スクリプト内からのものですが)。

これを行うload(out_file)と、そのファイルの内容がワークスペースにロードされます。ですから、それらは範囲内にあるべきではないと私は信じています。したがって、which(annotation)それを変数と呼んでいることに驚いていますannotationが、範囲外であることには驚いていません。(実際には、Matlabが変数をスコープに入れているように見えます。)

ある種の前処理についてのあなたの考えはannotationもっともらしいと思います。たとえば、に置き換えるother_function(annotation)と、おそらく機能します(ただし、を使用する必要がeval('other_function(annotation);')あるとは言っていません)。eval

これを解決する最良の方法は、次のようなことを行うことです。

data = load(out_file);
annotation = data.annotation;

したがって、構造体にロードout_fileし、そこから変数にアクセスします。

于 2012-05-02T11:57:04.940 に答える
0

これは(今?)文書化された動作です:

http://www.mathworks.com/help/matlab/import_export/troubleshooting-loading-variables-within-a-function.html

于 2013-03-11T07:55:27.700 に答える