我有一个名为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
不起作用。
谢谢:)
答案 0 :(得分:5)
嗯,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
重代码,看起来很简单,但很难让一切都完全正确。
答案 1 :(得分:1)
您可以使用动态字段名称:
someStruct.(someField) = DataToBeEntered;
其中someField
是包含字段名称的变量,但您必须将IndexString
解析为单个字段名称和索引。