9

次の例を考えてみましょう。

dat1 = 1;
dat2 = 2;

Variables = {'dat1','dat2'};

a = cellfun(@(x)exist(x,'var'),Variables);

for i = 1:length(Variables);
    a2(i) = exist(Variables{i},'var');
end

'a'と'a2'が異なる値を返すのはなぜですか?つまり、cellfunを使用しても、変数がワークスペースに存在することを示さないのはなぜですか?私は何が欠けていますか?

4

2 に答える 2

4

わかりました、私はここで何が起こっているのか理解していると思います:

匿名関数を呼び出すと、通常の関数と同様に、独自のワークスペースが作成されます。ただし、この新しいワークスペースは、呼び出し元のワークスペースにアクセスできません。

したがって

funH = @(x)exist(x,'var')

ワークスペース全体が変数で構成されているため、'x'入力()として指定した場合にのみ1が返されます。funH('x')'x'

その結果、

funH = @(x)exist('x','var') 

入力として何を指定したかに関係なく、常に1を返します。

これを回避する方法は2つあります。

(1)evalin発信者のワークスペースで評価するために使用します

 funH =  @(x)evalin('caller',sprintf('exist(''%s'',''var'')',x))

(2)の出力を使用してwhos、既存の変数のリストと照合します

 Variables = {'dat1','dat2'};
 allVariables = whos;
 a3 = ismember(Variables,{allVariables.name})
于 2013-02-08T16:33:53.490 に答える
2

私はあなたが次のようにcellfun行を書くべきだと思います:

a = cellfun(@(x) exist('x','var'),Variables); 

forループと同等にします。Matlabのドキュメントの例で使用する方法も参照してexistください...

編集:

Jonasの答えを(私は)理解した後、上記の行は、dat1=1またはに関係なく常にtrueを返しますdat1=[]。使用するにcellfunは、ジョナスの回答を参照してください...

于 2013-02-08T00:55:16.507 に答える