在分配数据到结构数组时避免评估

问题描述:

我有一个名为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;' ]) 

但有可能避免使用这个evalsetfield不适用于此。

谢谢:)

那么,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-具有类似目的的重磅代码,看起来很简单,但很难让一切都完全正确。

+0

我认为这是我正在寻找的。非常感谢你的出色答案! – nrz 2012-04-03 20:16:03

您可以使用动态字段名:

someStruct.(someField) = DataToBeEntered; 

其中someField是一个变量保存字段名称,但你将有你的IndexString解析到单个字段名和索引。

+1

动态字段名称本身并不能解决问题,因为IndexString可能还包含单元格数组索引,而不仅仅是struct的字段名。我想我需要编写一个函数,通过递归地遍历结构和单元格数组,将数据分配给适当的字段或适当的单元格。 – nrz 2012-04-03 19:53:45