matlab等分数组,关于数组:如何在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编制索引?
仅当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)
提供
>> xmatlab数组赋值
x =
88
>> y
y =
12
Mathworks上的完整⽂档。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论