在分配数据到结构数组时避免评估
我有一个名为AnalysisResults
的结构数组,它可能包含任何MATLAB数据类型,包括其他结构数组和单元数组。在分配数据到结构数组时避免评估
然后我有一个名为IndexString
字符串,它是索引的StructArray
特定子场中,并且它可以包含多个索引到不同结构数组和单元阵列,例如: 'SubjectData(5).fmriSessions{2}.Stats'
或'SubjectData(14).TestResults.Test1.Factor{4}.Subfactor{3}'
。
然后我有一个名为DataToBeEntered
的变量,它可以是任何MATLAB数据类型,通常是某种结构数组,矩阵或单元阵列。
使用eval
,很容易将数据输入到现场或通过细胞索引IndexString
:
eval([ 'AnalysisResults.', IndexString, ' = DataToBeEntered;' ])
但有可能避免使用这个eval
? setfield
不适用于此。
谢谢:)
那么,eval
肯定是最简单的方法,也是最肮脏的。
我想这样做的“正确”方法是使用subsasgn
。您必须将部分MATLAB命令(例如SubjectData(5).fmriSessions{2}.Stats
)解析为这些函数的正确表示。部分工作可以通过substruct
完成,但这是最轻的部分。
因此,例如,SubjectData(5).fmriSessions{2}.Stats
需要被翻译成
indexes = {'.' , 'SubjectData',
'()', {5},
'.' , 'fmriSessions',
'{}', {2},
'.' , 'Stats'};
indexStruct = substruct(indexes{:});
AnalysisResult = subsasgn(AnalysisResult, indexStruct, DataToBeEntered);
,你要开发这样的单元阵列indexes
如上使得代码。它不应该那么难,但它也不是微不足道的。去年我移植了一些eval
-具有类似目的的重磅代码,看起来很简单,但很难让一切都完全正确。
您可以使用动态字段名:
someStruct.(someField) = DataToBeEntered;
其中someField
是一个变量保存字段名称,但你将有你的IndexString
解析到单个字段名和索引。
动态字段名称本身并不能解决问题,因为IndexString可能还包含单元格数组索引,而不仅仅是struct的字段名。我想我需要编写一个函数,通过递归地遍历结构和单元格数组,将数据分配给适当的字段或适当的单元格。 – nrz 2012-04-03 19:53:45
我认为这是我正在寻找的。非常感谢你的出色答案! – nrz 2012-04-03 20:16:03