1

有没有办法在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. 
4

6 回答 6

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 的代码分析器已经抱怨的那样,这有点臭。通常,使用eval和friends 定义大量变量是您应该考虑不同方法的标志。

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

于 2013-07-08T09:31:54.213 回答
2

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

循环(请不要使用这个!):

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

eval大多数时候完全不需要和气馁;更改为单元格更易于管理和使用。您已经在向量中拥有变量,仅使用索引来检查它们有什么问题?

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

要将变量从 gui 导出到基本 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)的东西,但我不知道这是否可能。

于 2013-07-07T18:30:47.823 回答
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,但我认为这就是您所追求的。

于 2013-07-08T16:45:04.850 回答
0

怎么样[a,b,c] = deal(1,2,3)?还是我过于简单化了?

于 2013-07-08T10:21:22.277 回答
0

您可以执行以下操作:

[a, b] = function_returning_values();

您也可以使用eval.

于 2013-07-07T18:25:46.653 回答
0

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

x = [1 2 3];

然后,而不是awrite , write x(1),而不是bwritex(2)等等......

于 2013-07-07T18:55:53.567 回答