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

我想以某种方式将变量创建过程放入一个函数中,同时仅将所有变量读出给调用它的脚本,但我不想为输出分配一百个不同的变量名。有人对如何做到这一点有任何建议吗?

4

3 回答 3

1

不要创建无数个自动命名的变量。这是愚蠢且非常糟糕的编程风格。相反,学习使用数组。多维数组、元胞数组、结构数组。

或者,做你已经做过的事情,然后被迫找到一个你正在寻找的组合。

任你选。评估是邪恶的。

于 2012-09-20T18:55:32.680 回答
0

归功于罗迪...

#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 回答
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而无需预先定义所有输出变量名称。

您也可以一步完成:

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 回答