给出值,在matlab结构中返回字段名称

时间:2014-09-09 01:49:23

标签: matlab data-structures

我有一个像这样的Matlab结构:

Columns.T21=6;
Columns.ws21=9;
Columns.wd21=10;
Columns.u21=11;

是否有一些优雅的方式我可以给出值并返回字段名称?例如,如果我给6并且它将返回' T21。'我知道fieldnames()将返回所有字段名称,但我希望字段名为特定值。非常感谢!

4 个答案:

答案 0 :(得分:2)

目标:

vectors构建两个struct,一个用于fields的名称,另一个用于values。这类似于dict中的Pythonmap中的C++,其中您将唯一keys映射到可能非唯一values

简单解决方案:

您可以使用在Matlab中为struct定义的各种函数非常简单地执行此操作,即:struc2cell()cell2mat()

  1. 对于感兴趣的特定元素,例如结构1的{​​{1}},使用Columns函数获取单元格数组形式的所有字段的名称:

    fieldnames()
  2. 同样,以矩阵的形式获取fields = fieldnames( Columns(1) ) 元素的所有字段的值

    Columns
  3. 接下来,使用vals = cell2mat( struct2cell( Columns(1) ) ) 函数找到具有相应值的字段,例如6,并使用find函数将生成的1x1单元转换为字符:

    cell2mat()

    将产生:

    cell2mat( fields( find( vals == 6 ) ) )
    
  4. 现在,您可以定义一个为您执行此操作的函数,例如:

    T21
    

    使用function fieldname = getFieldForValue( myStruct, value) 数据抽象的高级解决方案:

    您还可以选择使用Map Container的字段名称containers.map定义struct类的对象,并将值设置为keySet

    valueSet

    这样您就可以使用相应的内置函数获取myMap = containers.Map( fieldnames( Columns(1) ), struct2cell( Columns(1) ) ); keys

    values

    现在,您可以找到与特定值对应的所有密钥,在这种情况下为6:

    myMapKeys = keys(myMap);
    myMapValues = values(myMap);
    

    再次产生:

    cell2mat( myMapKeys( find( myMapValues == 6) )' )
    

    警告:此方法或所有这样做的方法只有在所有字段都具有相同类型的值时才有效,因为我们向T21 正在转换matrix,需要为其所有元素提供统一的类型。但我从你的例子中假设情况总是这样。

    自定义功能/逻辑:

    vals由包含struct的{​​{1}} elements组成,其中fields全部按此顺序排列。因此valueselement keyfield。 “查找”的本质是为特定键(它们是唯一的)找到值(非唯一的)。因此,Matlab有一种内置的方式。但你想要的是另一种方式,即找到特定值的键。由于它不是典型的用例,您需要为它编写自己的逻辑或函数。

答案 1 :(得分:2)

假设结构包含带有标量数值的字段,您可以使用这种基于struct2array的方法 -

search_num = 6; %// Edit this for a different search number
fns=fieldnames(Columns) %// Get field names
out = fns(struct2array(Columns)==search_num) %// Logically index into names to find
                                             %// the one that matches our search 

答案 2 :(得分:1)

假设您的结构名为S。首先将所有字段名称提取到一个数组中:

fNames=fieldnames(S);

现在在代码中定义以下匿名函数:

myfun=@(yourArray,desiredValue) yourArray==desiredValue;

然后您可以获得所需的字段名称:

desiredFieldIndex=myfun(structfun(@(x) x,S),3) %desired value is 3 (say)
desiredFieldName=fNames(desiredFieldIndex)

答案 3 :(得分:1)

使用containers.Map

的备选方案

假设结构中的每个字段都包含一个标量值,如问题(不是数组)。

目标是创建一个Map对象,其字段值为 keys ,字段名称为 values

myMap = containers.Map(struct2cell(Columns),fieldnames(Columns))

现在使用值

将值索引的字段名称转换为myMap
myMap(6)

ans =

T21

这样做的好处是如果结构没有改变你可以重复使用myMap来查找其他值字段名称对