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)

提供

>> x

x =

88

>> y

y =

12

Mathworks上的完整文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值