这是我要寻找的示例:
>> 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编制索引?
仅当foo是一个单元格时,交易才有效。 您已将foo定义为标准数组。 这就是为什么您收到??? Cell contents reference from a non-cell array object.错误消息的原因。
您根本不需要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
附带一提,我认为您只能在Matlab 7+中不使用Deal(如第一个示例)。
有趣。 我不知道这笔交易现在是不必要的。 但是,我故意使用了mat2cell,因为我认为OP可能希望将列彼此分开。
真的很好 但是,有什么办法可以将全部内容整合到一条线上吗? 也许是这样的:[x y] = num2cell(foo){:}(对不起,Matlab仍然很困惑。)
@Justin:好点,您需要7.0版(2004)或更高版本。 @Jonas:是的,如果您想以不同的方式拆分,mat2cell很好。 @Benjamin:除非您使用单元格开始,否则我不知道单行方法; 如果从标量开始,则可以使用deal(88,12)。 如果我们对许多Matlab命令使用num2cell(foo){:}之类的东西,那就太好了。
请注意,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解决方案,请定义一个辅助函数list:
function varargout = list(x)
% return matrix elements as separate output arguments
% example: [a1,a2,a3,a4] = list(1:4)
varargout = num2cell(x);
end
示例[a1,a2,a3,a4] = list(1:4)是否会导致Too many output arguments错误?
地铁说什么。基本上,您要对单元格数组使用Deal(尽管Deal(88,12)也可以工作)。
假设您以n×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{:});
为了方便起见,创建一个函数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);
我无法评论其他答案,因此请单独添加。
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,如其他答案所述。
DEAL确实有用,而且令人困惑。我相信foo本身必须是一个单元数组。以下内容似乎可以在Octave中使用,如果我没记错的话,它也可以在MATLAB中使用:
> foo = {88, 12}
foo =
{
[1,1] = 88
[1,2] = 12
}
> [x,y] = deal(foo{:})
x = 88
y = 12
您可能正在寻找
>>> foo = [88, 12];
>>> [x, y] = deal(foo(1), foo(2))
导致
x =
88
y =
12
因此,您可以使用一个班轮。
有一种更简单的方法。
x = foo (1, 1)
y = foo (1, 2)
提供
>> x
x =
88
>> y
y =
12
Mathworks上的完整文档。