获取数据结构matlab的fieldname

时间:2015-09-21 09:13:21

标签: arrays matlab struct

我有以下嵌套结构:

hole 1x200 struct,diam 1x12 struct,其中包含以下字段:pos,freq1,fre12

那是:

hole(1 to 200).diam(1 to 12).pos
                            .freq1
                            .freq2

从值(freq1freq2),我想获取结构的字段名称。所以我需要找到与freq1和freq2匹配的值并显示fieldname。

我尝试使用structfun将函数应用于每个字段。

[struct.field]=structfun(@(x) find(x.freq1==27.059783995484867 & freq2==76.468355874897000))

但我想我在代码上写错了。

另外我创建了一个匿名函数但是我有以下错误:

  

'使用structfun /输入到STRUCTFUN的错误必须是标量   结构

。然而,当我验证结构的特定值是否是标量时,我得到了肯定答案:isscalar(hole(130).diam(10))

我相信我更接近使用此脚本的解决方案:

myfun=@(yourarray,desiredvalue) yourarray==desiredvalue;
%//Apply function to each field of scalar structure, it SCALAR??
desiredfieldindex=myfun(structfun(@(x) x,hole),26.697046257785030) 
desiredFieldName=fNames(desiredFieldIndex)

我不知道我是否处于严谨的路径中,或者我应该使用函数find。在那种情况下我也不知道如何实现它。

1 个答案:

答案 0 :(得分:1)

一些事情。

  1. 浮点值!小心!!永远不要将浮点值与val==0.3进行比较!做abs(val-0.3)<10^-8或类似的事情。 Read more here

  2. 您使用structfun错误。该函数需要2个参数,你只需传递1个!但是,structfun会将函数应用于每个字段,因此您不会在这种意义上使用它。让我们看一个例子

  3. 示例:

    a.hithere=5;
    a.notthis=3;
    fun=@(x)x==5;
    [isfive]=structfun(fun,a)
    
    
    isfive =
    
         1
         0
    

    如您所见,它将功能应用于每个功能。如果您尝试将功能更改为fun=@(x)x.hithere==5,则会出现错误!由于该函数应用于每个字段,因此x.hithere.hitherex.notthis.hithere不存在。

    如果您想要同时检查这两个值,则需要单独检查它们,分别调用structfun或避免structfun并进行for循环。