以下是我正在寻找的一个例子:
>> 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吗?
答案 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)
我不能评论其他答案,所以单独添加。
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)