2012-05-02 25 views
4

「注釈」という名前の変数と組み込みのMATLAB関数「注釈」との間にMATLABの名前の衝突があるようです。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"という名前の変数が含まれていることを確認しました。私は、主な機能のループの中でそれをロードすると、「これ」コマンドは、それが変数として存在するが、other_functionの呼び出しで、MATLAB関数「注釈」呼び出そうと私に語った:

注釈が可変であるが。

??? 71

ない14

 other_function(annotation); 

私は変数名「注釈」を使用していますので、私は混乱していますで==>テストで十分な入力引数

エラーで==>注釈を使用してエラー私のプログラムのいくつかの部分では、関数呼び出しのパラメータとしても使用できます。私が想像できる唯一の説明は、MATLABが私のコードをどうにかプリコンパイルするということです。 "コンパイル時"に変数 "注釈"は表示されません。しかし、実行時には、 "which"コマンドの出力からわかるように、

ご協力いただければ幸いです!事前に多くの感謝。

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

+0

、私はあなたの変数annotation.Wellの名前を変更しているだろうすべては、私が注釈を見ることができませんあなたのコードで変数として宣言されています。私がMatlabを理解しているので、スクリプト言語なので、尋ねることなくすべてを上書きします。あなたはデバッガを使ってthrouhgに行き、 "which"の注釈の中に何が入っているのか見てみることができますか? –

+0

デバッガは注釈が変数であると言い、デバッガに 'annotation'と入力するとエラーなしで評価します。 – Richante

答えて

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、その後、そこから変数にアクセスします。これを解決する

最良の方法は、のような何かをするだろう。

+0

ありがとう、それは間違いなく良い考えです。また、変数の注釈が明示的に宣言されているので、コードをわかりやすくします。 – Jenny

2

これは美しくわかりにくい問題です!それはMathworkの部分では駄目なデザインです。私はバグと呼んで、彼らが同意するかどうかを調べることも興味深いでしょう。

短い答え:load(out_file);行の上にコード内の任意の場所にannnotation = 2;という行を追加することで、これを修正することができます。あるいはannotation = "roger";またはannotation = false;のように、コード内の変数に明示的に強制している限り、注釈を行う変数のタイプは関係ありません。

あなたのコードは明示的に変数annotationを参照していません。 annotationは、関数のワークスペースに読み込んだmatlabファイル内の変数の名前に過ぎません。何とか、これはランタイムエラーをスローしません、それはちょうど間違って、私はバグを呼び出すだろうが、matlabは文書化された制限と言うかもしれません。 http://www.mathworks.com/help/techdoc/matlab_prog/f4-39683.html#f4-75258のドキュメントを参照し、あなたの意見を教えてください。そのドキュメントは、ネストされた関数に当てはまるようですが、あなたの主な機能は確かにそうではありません。明らかにあなたのラインother_function(annotation)は、と同じスコープでannotationが表示されるはずです。 (私はちょうどそのテストをしたとannotation 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でバグレポートとしてこれを提出するあなたをご招待します!あなたがしたくない場合、私はそれを報告します、私に知らせてください。

+0

この問題に対処する方法についてのご意見ありがとうございます! 本書では、ネストされた「場合によっては」匿名機能についてのみ説明していることに同意します。さらに、最小限の例では、関数prepareはサブ関数ですが、私がその問題を発見した元のコードでは、それは主要な関数でもあります。 私はこれに関するバグ報告を提出しようとしましたが、残念ながら – Jenny

+0

私はこれに関するバグ報告を提出しようとしましたが、残念ながらMathworksサイトは私に許可しません(前にこの問題がありました。 )。あなたがそうすることができればいいと思うし、このバグに従うことができるリンクを私に送ってください。 – Jenny

+0

[bug report](http://www.mathworks.com/support/service_requests/Service_Request_Detail.do?ID=632255&filter=&sort=&statusorder=0&dateorder=0)を提出しました。私のですが、**の関数呼び出しは、ローカル変数の代わりに関数にアクセスします。** – mwengler

関連する問題