2016-04-04 19 views
0

最近では、変数名がパス内のMATLAB関数名と同じ名前であれば、呼び出し元関数に新しい変数を作成する関数でassignin('caller',...)を呼び出すと、matlabコードに問題が見つかりました。matlabの変数名前空間

ここでは、問題を示すための簡単なコードスニペットを示します。

function myfunctest 
    sin = 0; 
    subfcn_set; % call subfcn_set to make a new variable 
    whos % list variables in current workspace 
    sin % raise error because it calls the sin function 
end 

function subfcn_set 
    assignin('caller', 'sin', 'I am sine'); 
end 

myfunctest.mにスニペットを保存して、MATLABで

>> myfunctest 
    Name  Size   Bytes Class Attributes  
    sin  1x9    18 char  

sin =  
I am sine 

を、それを実行するすべてがよさそうです。私はmyfunctestsin = 0を削除して、もう一度それを実行した場合でも、

>> myfunctest 
    Name  Size   Bytes Class Attributes  
    sin  1x9    18 char  
Error using sin 
Not enough input arguments.  
Error in myfunctest (line 8) 
sin 

組み込みsin関数は、変数sinwhosによって示されるように存在していても呼ばれています。これはパス内の他のMATLAB関数名にも当てはまります。

変数名をsinから別のもの(たとえばnotafunc)に変更すると、初期化に関係なくすべてが良好に見えます。

>> myfunctest 
    Name   Size   Bytes Class Attributes  
    notafunc  1x13    26 char 
notafunc =  
I am notafunc 
+3

Matlabパス上の関数と名前を共有するすべての変数には、シンボルを変数として使用していることをコンパイラに知らせるための明示的な割り当てが必要です。同様の質問[ここ](http://stackoverflow.com/questions/26412276/puzzling-error-with-script-run-in-function/26414381#26414381)に回答してください。 – TroyHaskin

+0

はい、答えはポイントです。その投稿は直接関連していないように見えますし、検索で見つけられませんでした。 – Lee

答えて

1

これは実際問題ではありません。 assigninのドキュメントから:

assignin(ws, 'var', val)ワークスペースWS内の変数varに値valを割り当てます。 var入力は配列名でなければなりません。配列インデックスを含むことはできません。指定したワークスペースにvarが存在しない場合は、assigninが作成されます。

名前空間MathWorks社のMATLABで既存の関数sin()がありますので、変数を作成しません。

私はこのアプローチをお勧めしません。あなたのコードを使用する他の人を混乱させるからです。この行が存在するかどうかわからない場合は、何が起こるか分からないでしょう。サブファンクションがサブファンクションを使用するファンクションと同じ.mファイルに定義されている場合は、他のファンクションへのサブファンクションの例外を作成できます。しかし、それでもファイルが大きい場合にはまばらに使用する必要があります。