如何在MATLAB中进行多项分配?
这里是我正在寻找的一个例子:
>> 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吗?
 你根本不需要deal (编辑:对于Matlab 7.0或更高版本),对于你的例子,你不需要mat2cell ; 你可以使用num2cell没有其他参数:: 
 foo = [88, 12]; fooCell = num2cell(foo); [xy]=fooCell{:} x = 88 y = 12 
 如果您想要使用deal的其他原因,您可以: 
 foo = [88, 12]; fooCell = num2cell(foo); [xy]=deal(fooCell{:}) x = 88 y = 12 
 请注意, deal接受“列表”作为参数,而不是一个单元格数组。 所以以下按预期工作: 
 > [x,y] = deal(88,12) x = 88 y = 12 
 语法c{:}将列表中的单元格数组转换成一个单元格数组,而列表是逗号分隔的值 ,就像函数参数一样。 这意味着您可以使用c{:}语法作为其他函数的参数而不是deal 。 要看到这一点,请尝试以下操作: 
 > z = plus(1,2) z = 3 > c = {1,2}; > z = plus(c{:}); z = 3 
 要在num2cell中使用num2cell解决scheme,请定义一个辅助函数list : 
 function varargout = list(x) % return matrix elements as separate output arguments % example: [a1,a2,a3,a4] = list(1:4) varargout = num2cell(x); end 
什么mtrw说。 基本上,你想要使用单元格数组处理(尽pipedeal(88,12)也适用)。
假设你从一个n乘2的数组foo开始,并且想要将第一列分配给x,将第二列分配给y,则执行以下操作:
 foo = [88,12;89,13;90,14]; %# divide the columns of foo into separate cells, ie do mat2cell(foo,3,[1,1]) fooCell = mat2cell(foo,size(foo,1),ones(size(foo,2),1)); [x,y] = deal(fooCell{:}); 
  交易是非常有用的,真的很混乱。 我相信foo需要成为一个单元arrays。 以下似乎工作在八度,如果我没有记错,它也将在MATLAB中工作: 
 > foo = {88, 12} foo = { [1,1] = 88 [1,2] = 12 } > [x,y] = deal(foo{:}) x = 88 y = 12 
我不能评论其他答案,所以单独添加。
如果你是从标量开始,你可以使用交易(88,12)
  deal也可以用作非标量的单线程,当然如果你已经有了单独的variables,就说: 
 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' 
 但是,如果将它们打包在一个variables中,则只能在单元格或结构数组中deal它们 – 对于单元格数组使用deal(X{:}) ,对结构数组使用deal(S.field) 。  (在后一种情况下,只有一个字段被处理,但是来自数组中的所有结构)。使用Matlab v.7 +,您可以使用X{:}和S.field而无需deal ,如其他答案中所述。 
你可能正在寻找
 >>> foo = [88, 12]; >>> [x, y] = deal(foo(1), foo(2)) 
导致
 x = 88 y = 12 
所以你有一个工作class轮。
有一个更简单的方法。
 x = foo (1, 1) y = foo (1, 2) 
提供
 >> x x = 88 >> y y = 12 
Mathworks的完整文档。
为了方便创build一个函数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);