如何在MATLAB中进行多项赋值?

时间:2010-02-25 19:50:13

标签: arrays matlab variables variable-assignment

以下是我正在寻找的一个例子:

>> foo = [88, 12];
>> [x, y] = foo;

之后我期待这样的事情:

>> x

x =

    88

>> y

y =

    12

但我得到的错误如下:

??? Too many output arguments.

我认为deal()可能会这样做,但它似乎只适用于细胞。

>> [x, y] = deal(foo{:});
??? Cell contents reference from a non-cell array object.

如何解决我的问题?如果我想单独处理它们,我必须经常索引1和2吗?

9 个答案:

答案 0 :(得分:42)

您根本不需要deal(编辑:适用于Matlab 7.0或更高版本),对于您的示例,您不需要mat2cell;您可以使用num2cell而不使用其他参数::

foo = [88, 12];
fooCell = num2cell(foo);
[x y]=fooCell{:}

x =

    88


y =

    12

如果您出于其他原因想要使用deal,可以:

foo = [88, 12];
fooCell = num2cell(foo);
[x y]=deal(fooCell{:})

x =

    88


y =

    12

答案 1 :(得分:16)

请注意deal接受“list”作为参数,而不是单元格数组。所以以下工作按预期进行:

> [x,y] = deal(88,12)
x = 88

y = 12

语法c{:}转换列表中的单元格数组,列表是comma separated values,就像函数参数一样。这意味着您可以使用c{:}语法作为除deal之外的其他函数的参数。要看到这一点,请尝试以下方法:

> z = plus(1,2)
z = 3

> c = {1,2};
> z = plus(c{:});
z = 3

答案 2 :(得分:8)

要在一行中使用num2cell解决方案,请定义辅助函数list

function varargout = list(x)
% return matrix elements as separate output arguments
% example: [a1,a2,a3,a4] = list(1:4)

varargout = num2cell(x);

end

答案 3 :(得分:4)

mtrw说的是什么。基本上,你想使用处理单元格数组(虽然交易(88,12)也可以。)

假设您从一个n-by-2的数组foo开始,并且您希望将第一列分配给x而第二列分配给y,则执行以下操作:

foo = [88,12;89,13;90,14];
%# divide the columns of foo into separate cells, i.e. do mat2cell(foo,3,[1,1])
fooCell = mat2cell(foo,size(foo,1),ones(size(foo,2),1));
[x,y] = deal(fooCell{:});

答案 4 :(得分:1)

DEAL非常有用,而且非常令人困惑。我相信foo本身需要一个单元阵列。以下似乎适用于Octave,如果我没记错的话,它也可以在MATLAB中使用:

> foo = {88, 12}
foo =

{
  [1,1] =  88
  [1,2] =  12
}

> [x,y] = deal(foo{:})
x =  88
y =  12

答案 5 :(得分:1)

我不能评论其他答案,所以单独添加。

  

you can use deal(88,12) if you are starting from scalars

deal也可以作为非标量的单行使用,当然如果你已经将它们放在单独的变量中,比如说:

a = 123;
b = rand(3);
c = {a, b};
d = struct('field','val')

现在你用一行来处理它们:

>> [x,y,z,w] = deal(a,b,c,d)
x =
   123
y =
    0.6370    0.2165    0.6711
    0.2945    0.8803    0.2705
    0.7633    0.1537    0.0767
z = 
    [123]    [3x3 double]
w = 
    field: 'val'

但是,如果将它们打包在一个变量中,则只有deal它们位于单元格或结构数组中 - 单元格数组为deal(X{:}),结构数组为deal(S.field) 。 (在后一种情况下,只发出一个字段,但来自数组中的所有结构。)使用Matlab v.7 +,您可以使用X{:}S.field而不使用deal,如其他答案。

答案 6 :(得分:1)

为方便起见,创建一个函数arr2vars

function varargout = arr2vars(arr)
% Distribute elements over variables

N = numel(arr);
if nargout ~= N
    error('Number of outputs does not match number of elements')
end
for k = 1:N
    varargout{k} = arr(k);
end

你可以像这样使用它

[~,roi] = imcrop(im);
[x,w,y,h] = arr2vars(roi);

答案 7 :(得分:0)

您可能正在寻找

>>> foo = [88, 12];
>>> [x, y] = deal(foo(1), foo(2))

导致

x = 
    88

y = 
    12

所以你有一个工作单行。

答案 8 :(得分:-1)

有一种更简单的方法。

x = foo (1, 1)  
y = foo (1, 2)

提供

>> x

x =

88

>> y

y =

12

Mathworks.

的完整文档