有效地定义多个变量

时间:2013-07-07 18:23:03

标签: matlab

有没有办法在matlab中有效地定义多个变量?我发现的一切都不是我想要的。情况如下:

parstrs = {'a','b','c'};
parvals = [1 2 3];

我想要一个有效的命令,它实际上会做到以下几点;

parstrs = parvals;

其中结果是数字1存储在变量a中,2存储在b中,3存储在c等中。

我愿意用细胞或结构来做这件事。

有什么建议吗?

更多说明:正如我在下面提到的,我想编写的代码不关心变量名列表在曲线拟合中使用多长时间。我发现的最好的方法是使用一个结构,如下所示:

parstrs = {'a','b','c'};
parvals = num2cell([1 2 3]);
partmp = {parstrs{:};parvals{:}};
pars = struct(partmp{:});

这个问题是无法以相同的方式编辑pars结构。也就是说,

pars = setfield(pars,partmp{:});

将抛出以下错误:

 Error using setfield (line 48)
 Inputs must be either cell arrays or strings. 

6 个答案:

答案 0 :(得分:2)

你正在寻找eval,但这可能仍然需要一个循环(是的,你可以生成一个冗长的命令,但你真的想要吗?):

循环(请不要使用它!):

for ii=1:numel(parvals)
    eval([parstrs(ii) '=parvals(' ii ')']);
end

eval大部分时间都是完全不需要和沮丧的;更改为单元格更容易管理和使用。你已经在向量中有变量,只需使用索引来检查它们有什么问题?

你应该多解释一下你的应用程序,这样我们才能理解你真正想要的是什么,为什么你真的想要使用这种变量赋值。

要将变量外部的变量导出到基本matlab环境,您可以切换到evalin,并按如下方式使用它:

function main_gui()

    % do your thing, generate some values
    parvals = [1 2 3];

    % now is the time to export
    give_me_my_vars({'a','b','c'});

    % note that the following function is nested:
    function give_me_my_vars(parstrs)
        for ii=1:numel(parvals)
             evalin('base',[parstrs(ii) '=' parvals(ii)]);
        end
    end
end

这仅适用于符合字符串的简单标量。我想你实际上想找一些东西把变量从一个工作区切换到另一个工作区(gui到base),但我不知道这是否可行。

答案 1 :(得分:2)

可以使用

parstrs = {'a','b','c'};
parvals = {'1' '2' '3'};

cellfun(@(x,y)evalin('caller', [x '=' y]), parstrs, parvals)

或者,您可以执行类似

的操作
parstrs = {'a','b','c'};
parvals = {1 2 3};

parstrs = cellfun(@(x)[x ','], parstrs, 'UniformOutput', false);
eval(['[' parstrs{:} '] = deal(parvals{:});'])

然而,由于MATLAB的代码分析器已经抱怨,这是a bit smelly。通常,使用eval和朋友进行质量定义变量是一个标志,您应该考虑采用不同的方法。

例如,为什么您甚至希望能够通过单独的变量名称来处理值?为什么parvals(1)parvals(2)等不够好?

答案 2 :(得分:1)

您可以使用parstrs创建一个字段名称的结构,其值取自parvals,如下所示:

parstrs = {'a', 'b', 'c'};
parvals = [1 2 3];

nValues = length(parvals);

for iValue = 1:nValues
    s.(parstrs{iValue}) = parvals(iValue);
end

结构s,如下所示:

s = 
    a: 1
    b: 2
    c: 3

所以不是a = 1,而是s.a = 1,但我认为不是你所追求的。

答案 3 :(得分:0)

您可以执行以下操作:

[a, b] = function_returning_values();

您也可以使用eval

答案 4 :(得分:0)

您可以将值存储在单个数组中的大部分机会:

x = [1 2 3];

然后,不要写a,而是写x(1),而不是bx(2)等等......

答案 5 :(得分:0)

[a,b,c] = deal(1,2,3)之类的内容怎么样?或者我过度简化了?