找回密码
 注册
Simdroid-非首页
查看: 100|回复: 6

小白询问:多个变量如何批量赋值?

[复制链接]
发表于 2015-1-25 22:36:02 | 显示全部楼层 |阅读模式 来自 广东深圳
point=[1,2,3];
[x,y,z]=point;
运行结果:
??? Too many output arguments.

输出变量太多。但我希望右边每个元素都单独赋给一个变量。x=point(1,1)这样当然可以,想问一下有没有更简洁的批量赋值方法?小白一枚,请不吝赐教!
发表于 2015-1-26 02:58:07 | 显示全部楼层 来自 英国
Simdroid开发平台
  1. ptcell = num2cell(point);
  2. [x, y, z] = deal(ptcell{:});
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2015-1-26 10:07:13 | 显示全部楼层 来自 广东深圳
本帖最后由 Liumw 于 2015-1-26 10:10 编辑
你的方法果然对!如果按照这种写法:
[x,y,z]=deal(num2cell(point));
结果是:
x =
    [1]    [2]    [3]
y =
    [1]    [2]    [3]
z =
    [1]    [2]    [3]


可不可以用一句就实现需要的功能呢?还是只能自己编写一个小函数?


回复 不支持

使用道具 举报

发表于 2015-1-26 11:42:05 | 显示全部楼层 来自 北美地区
Liumw 发表于 2015-1-26 10:07
你的方法果然对!如果按照这种写法:
[x,y,z]=deal(num2cell(point));
结果是:

你这种写法, deal 实现的是复制功能,是将整个 cell 复制给 x、y、z。而你是要将 cell 的内容逐个赋值给 x、y、z,这可以直接赋值实现,无需 deal,前提是版本不低于7.0。
S = num2cell(point);
[x, y, z] = S{:}

事实上,我不认为你这么做有必要,因为访问 point 数组元素比访问 x、y、z 更方便,没有必要产生x、y、z这些变量来代替point,这就跟matlab不推荐Variables with Sequential Names一个道理:http://cn.mathworks.com/help/mat ... ing-evaluation.html

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2015-1-26 12:18:42 | 显示全部楼层 来自 英国
Liumw 发表于 2015-1-26 10:07
你的方法果然对!如果按照这种写法:
[x,y,z]=deal(num2cell(point));
结果是:

这个过程里的重点是生成comma-separated list, 也就是{:}。deal反而是可有可无。
所以真要精简的话可以去掉deal:
ptcell = num2cell(point);
[x, y, z] = ptcell{:};

只要matlab版本不是太老,效果和用deal也是一样。

这个方法是最直接的,但是似乎难以在一行之内解决。如果想把代码保持在一行之内,这样单纯使用cell可能不行,需要曲线救国:
[x, y, z] = struct('name', num2cell(point)).name

原理同样是生成comma-separated list,但回避了{:}。与第一个方法类似,deal可有可无。

点评

版主总结得很好,这两种方法( cell 和结构体)是批量自动生成comma-separated list最行之有效的两种办法  发表于 2015-1-29 02:58
回复 不支持

使用道具 举报

发表于 2015-1-27 16:11:40 | 显示全部楼层 来自 广东
本帖最后由 qibbxxt 于 2015-1-27 16:14 编辑
nwcwww 发表于 2015-1-26 12:18
这个过程里的重点是生成comma-separated list, 也就是{:}。deal反而是可有可无。
所以真要精简的话可以 ...

在这个地方,有无deal并无大碍,在一些多变量的输出的匿名函数的构造中,deal函数能起到不小的作用的

有兴趣,可以参见:http://cn.mathworks.com/matlabcentral/cody/problems/1210-two-output-anonymous-function

结构体的构造比较巧妙

不过用{:}同样也可以在一句话完成的


  1. [x,y,z] = feval(@(x)x{:},num2cell(point))
复制代码

评分

2

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-21 22:36 , Processed in 0.046234 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表