在为结构数组分配数据时避免使用eval

时间:2012-04-03 18:12:40

标签: matlab struct eval cell

我有一个名为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不起作用。

谢谢:)

2 个答案:

答案 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解析为单个字段名称和索引。