Matlab 向结构数组分配数据时避免求值

Matlab 向结构数组分配数据时避免求值,matlab,struct,eval,cell,Matlab,Struct,Eval,Cell,我有一个名为AnalysisResults的结构数组,它可能包含任何MATLAB数据类型,包括其他结构数组和单元数组 然后我有一个名为IndexString的字符串,它是StructArray的特定子字段的索引,它可能包含不同结构数组和单元格数组的多个索引,例如: 'SubjectData(5).fmriSessions{2}.Stats'或'SubjectData(14).TestResults.Test1.Factor{4}.Subfactor{3}' 然后我有一个名为datatobeent

我有一个名为
AnalysisResults
的结构数组,它可能包含任何MATLAB数据类型,包括其他结构数组和单元数组

然后我有一个名为
IndexString
的字符串,它是
StructArray
的特定子字段的索引,它可能包含不同结构数组和单元格数组的多个索引,例如:
'SubjectData(5).fmriSessions{2}.Stats'
'SubjectData(14).TestResults.Test1.Factor{4}.Subfactor{3}'

然后我有一个名为
datatobeented
的变量,它可以是任何MATLAB数据类型,通常是某种结构数组、单元数组或矩阵

使用
eval
,很容易将数据输入到由
IndexString
索引的字段或单元格中:

eval([ 'AnalysisResults.', IndexString, ' = DataToBeEntered;' ])
但是在这种情况下是否可以避免使用
eval
<代码>设置字段对此不起作用


谢谢:)

您可以使用动态字段名:

someStruct.(someField) = DataToBeEntered;

其中,
someField
是一个包含字段名的变量,但您必须将
IndexString
解析为单个字段名和索引。

嗯,
eval
无疑是最简单的方法,但也是最肮脏的方法

我想,这样做的“正确”方式是使用。您必须将部分MATLAB命令(例如,
SubjectData(5).fmriSessions{2}.Stats
)解析为这些函数的正确表示形式。一部分工作可以由你来完成,但那是最轻的部分

例如,
SubjectData(5).fmriSessions{2}.Stats
需要翻译成

indexes = {'.' , 'SubjectData',
           '()', {5},
           '.' , 'fmriSessions',
           '{}', {2},
           '.' , 'Stats'};
indexStruct = substruct(indexes{:});
AnalysisResult = subsasgn(AnalysisResult, indexStruct, DataToBeEntered);

您必须开发代码,使单元格数组
索引
如上所述。这应该没那么难,但也不是小事。去年,我移植了一些类似用途的
eval
重代码,看起来很容易,但很难完全正确。动态字段名本身并不能解决问题,因为索引字符串可能还包含单元格数组索引,而不仅仅是结构的字段名。我想我需要编写一个函数,通过递归地遍历结构和单元数组,将数据分配给适当的字段或适当的单元。我想这就是我要寻找的。非常感谢您出色的回答!