罗兰谈MATLAB的艺术gydF4y2Ba

将想法转化为MATLABgydF4y2Ba

请注意gydF4y2Ba

罗兰谈MATLAB的艺术gydF4y2Ba已存档,不会更新。gydF4y2Ba

使用结构数组gydF4y2Ba

虽然我在过去已经讨论过这个主题,但现在似乎是更新信息的好时机。MATLAB新闻组中最近有一些与此主题相关的帖子,例如gydF4y2Ba这一个gydF4y2Ba.gydF4y2Ba

内容gydF4y2Ba

最初的问题gydF4y2Ba

假设我有一个结构数组,想要找到所有值为4的元素,gydF4y2Ba没有循环gydF4y2Ba,就像gydF4y2Ba[m,n] = find(f.h == 4)gydF4y2Ba.gydF4y2Ba

F (1).h = [1 2 3 4];F (2).h = [5 6 7 8];gydF4y2Ba试一试gydF4y2Ba[m,n] = find(f.h == 4);gydF4y2Ba结束gydF4y2Ba

为什么我不能使用gydF4y2Ba找到gydF4y2Ba直接声明?让我们看一看错误消息来理解。gydF4y2Ba

Lerr = lasterror;disp (lerr.message)gydF4y2Ba
使用==> eq错误输入参数太多。gydF4y2Ba

输入参数太多?什么gydF4y2Ba是gydF4y2Baf.hgydF4y2Ba?就此而言,到底是什么gydF4y2BafgydF4y2Ba一遍吗?gydF4y2Ba

fgydF4y2Ba
F = 1x2结构数组字段:hgydF4y2Ba

fgydF4y2Ba是一个gydF4y2Ba结构体gydF4y2Ba数组,并gydF4y2Baf.hgydF4y2Ba是逗号分隔的列表。gydF4y2Ba

f.hgydF4y2Ba
Ans = 1 2 3 4 Ans = 5 6 7 8gydF4y2Ba

选择gydF4y2Ba

为了将这个列表转换成我可以使用的MATLAB结构,我通常会将它包装在里面gydF4y2Ba[]gydF4y2Ba或gydF4y2Ba{}gydF4y2Ba.如果我把它包起来gydF4y2Baf.hgydF4y2Ba内部gydF4y2Ba[]gydF4y2Ba的第一个元素的信息就丢失了gydF4y2BafgydF4y2Ba第二个是什么。gydF4y2Ba

(f.h)gydF4y2Ba
Ans = 1 2 3 4 5 6 7 8gydF4y2Ba

包装gydF4y2Baf.hgydF4y2Ba内部gydF4y2Ba{}gydF4y2Ba,我有一个单元格数组的工作。gydF4y2Ba

{f.h}gydF4y2Ba
Ans = [1x4 double] [1x4 double]gydF4y2Ba

我还是不能马上使用gydF4y2Ba找到gydF4y2Ba或者这个数组上的数值函数。gydF4y2Ba

试一试gydF4y2Ba[m,n] = find({f.h} == 4);gydF4y2Ba结束gydF4y2BaLerr = lasterror;disp (lerr.message)gydF4y2Ba
错误使用==> evalin未定义的函数或方法'eq'输入参数类型'cell'。gydF4y2Ba

解决方案gydF4y2Ba

我想要的是一种使用我的结构的方式,不需要编写太多的代码,不需要循环,这是一种理想的模式,我可以在我的问题发展时重用。这就是gydF4y2BaarrayfungydF4y2Ba是用来帮助。它作用于数组的每个元素,我只需要告诉它我想对一个元素做什么,以及告诉gydF4y2BaarrayfungydF4y2Ba要处理哪个数组。gydF4y2Ba

让我们首先在结构数组中找到值gydF4y2BafgydF4y2Ba等于4。因为我有两个数组嵌入gydF4y2BafgydF4y2Ba,它们可能每个都有不同数量的输出,我必须清楚地说明输出需要进入一个单元格数组。gydF4y2Ba

[m,n] = arrayfun(@(x)find(x.h==4),f,gydF4y2Ba“uniformoutput”gydF4y2Ba假)gydF4y2Ba
M = [1] [1x0 double] n = [4] [1x0 double]gydF4y2Ba

如果我用另一个数组,这就更明显了,gydF4y2BaggydF4y2Ba这甚至比gydF4y2BafgydF4y2Ba.gydF4y2Ba

G = f;G (3).h = [1 2 17 4];G (4).h = [1 3 17 5 9 17];[mg,ng] = arrayfun(@(x)find(x.h==17),g,gydF4y2Ba“uniformoutput”gydF4y2Ba假)gydF4y2Ba
Mg = [1x0 double] [1x0 double] [1] [1x2 double] ng = [1x0 double] [1x0 double] [3] [1x2 double]gydF4y2Ba

然而,有些问题比较温和,在单元格数组中返回结果,然后必须将它们解压缩到数值数组中(例如函数),这将是一种浪费gydF4y2Ba马克斯gydF4y2Ba,通常只有一个值作为结果。gydF4y2Ba

[minval, idx] = arrayfun (@ (x)马克斯(x.h), f) [minval idx] = arrayfun (@ (x)马克斯(x.h), g)gydF4y2Ba
Minval = 4 8 idx = 4 4 Minval = 4 8 17 17 idx = 4 4 3 3gydF4y2Ba

相关的话题gydF4y2Ba

这里有一些相关博客和MATLAB参考页面的链接。gydF4y2Ba

你的想法gydF4y2Ba

  • 你使用结构数组吗?gydF4y2Ba
  • 如果是,你是否使用gydF4y2BaarrayfungydF4y2Ba,还是使用循环?无论你的选择是什么,你能说说为什么你会选择吗?gydF4y2Ba
  • 你是否完全避免使用结构数组而使用其他的结构数组?如果是,你用什么数据表示代替?gydF4y2Ba

让我们看看你的反馈gydF4y2Ba在这里gydF4y2Ba.gydF4y2Ba




使用MATLAB®7.3发布gydF4y2Ba


  • 打印gydF4y2Ba
  • 发送电子邮件gydF4y2Ba

评论gydF4y2Ba

如欲留言,请点击gydF4y2Ba在这里gydF4y2Ba登录您的MathWorks帐户或创建一个新帐户。gydF4y2Ba

Baidu
map