1

サブ関数を含まなければならない関数f1があるので、別のスクリプトを使用できません。

function vars = f1()

    a = 1;
    b = 'hello';
    c = {[1 2 3]};

    currvars = whos;    %all variable info
    for k = 1:size(currvars, 1)
        eval(['vars.(currvars(k).name) = ' currvars(k).name ';']);
    end

end

スクリプトで関数を呼び出し、genvarname()とeval()を使用してスクリプトで変数を作成します。

vars = f1();
varnames = genvarname(fieldnames(vars));
for k = 1:size(varnames(:),1)    %Creates vars with the struct's fieldnames.
    eval([varnames{k} ' = vars.' varnames{k} ';']);
end
clearvars vars varnames

変数作成プロセスを関数に適合させ、それを呼び出すスクリプトにのみすべての変数を読み取りたいのですが、出力に100の異なる変数名を割り当てたくありません。誰かがこれを行う方法について何かアドバイスがありますか?

4

3 に答える 3

1

自動的に名前が付けられた無数の変数を作成しないでください。これは愚かでひどく貧弱なプログラミングスタイルです。代わりに、配列の使い方を学びましょう。多次元配列、セル配列、構造体配列。

または、あなたがしたことをして、あなたが探しているような応急修理を見つけることを余儀なくされます。

好きなものを選んでください。評価は悪です。

于 2012-09-20T18:55:32.680 に答える
0

「修正された」フィールド名を持つ構造を返すことができます。

function output = someFunc

    vars = f1();

    protected = { %# some list of varnames you don't want
    };

    names    = fieldnames(vars);
    newnames = genvarname(names, protected);

    for k = 1:numel(newnames)
        output.(newnames{k}) = vars.(names{k});            
    end

end

その後使用する場合

output = someFunc;
varnames = fieldnames(output);
for k = 1:numel(fieldnames)
    eval([varnames{k} ' = output.' varnames{k} ';']);
end

変数名が必要なスクリプト/関数では、someFuncすべての出力変数名を事前に定義しなくても、関数内のすべてをロックする比較的クリーンな方法があります。

これを1つのステップで実行することもできます。

function someFunc2

    vars = f1();

    protected = { %# some list of varnames you don't want
    };

    names    = fieldnames(vars);
    newnames = genvarname(names, protected);

    for k = 1:numel(newnames)
        assignin('caller', newnames{k}, vars.(names{k}));
    end

end

つまり、関数を呼び出すだけです

someFunc2;

スクリプト内で、関数はスクリプトのワークスペース内のすべての変数を定義して割り当てます。

小さな一歩ですが、それでも前進します:)

于 2012-09-21T05:58:06.647 に答える
0

RODYへのクレジット...

#Old semi-"global" variables:

function vars = f1()

    a = 1;
    b = 'hello';
    c = {[1 2 3]};
    currvars = whos;    %all variable info
    for k = 1:size(currvars, 1)
       eval(['vars.(currvars(k).name) = ' currvars(k).name ';']);
    end

end

#Function to assign variables to the calling script's/function's workspace. Variable names are determined by the single structure's fieldnames:
function setvars(func)

    vars = func;
    protected = {'If needed, put variable names you do not want here'};
    names    = fieldnames(vars);
    newnames = genvarname(names, protected);
    for k = 1:numel(newnames)
        assignin('caller', newnames{k}, vars.(names{k}));
    end

end

#Script call:

setvars(f1);
于 2012-09-21T13:09:37.073 に答える