我有一个像这样的Matlab结构:
Columns.T21=6;
Columns.ws21=9;
Columns.wd21=10;
Columns.u21=11;
是否有一些优雅的方式我可以给出值并返回字段名称?例如,如果我给6并且它将返回' T21。'我知道fieldnames()将返回所有字段名称,但我希望字段名为特定值。非常感谢!
答案 0 :(得分:2)
目标:
从vectors
构建两个struct
,一个用于fields
的名称,另一个用于values
。这类似于dict
中的Python
或map
中的C++
,其中您将唯一keys
映射到可能非唯一values
简单解决方案:
您可以使用在Matlab中为struct
定义的各种函数非常简单地执行此操作,即:struc2cell()
和cell2mat()
对于感兴趣的特定元素,例如结构1
的{{1}},使用Columns
函数获取单元格数组形式的所有字段的名称:
fieldnames()
同样,以矩阵的形式获取fields = fieldnames( Columns(1) )
元素的所有字段的值
Columns
接下来,使用vals = cell2mat( struct2cell( Columns(1) ) )
函数找到具有相应值的字段,例如6,并使用find
函数将生成的1x1单元转换为字符:
cell2mat()
将产生:
cell2mat( fields( find( vals == 6 ) ) )
现在,您可以定义一个为您执行此操作的函数,例如:
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
全部按此顺序排列。因此values
为element
key
为field
。 “查找”的本质是为特定键(它们是唯一的)找到值(非唯一的)。因此,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
来查找其他值字段名称对