Структура динамических имен полей Matlab с массивами ячеек - PullRequest
3 голосов
/ 29 сентября 2011

Как я могу получить доступ к следующему пути структуры с динамическими именами полей:

var = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';

fields = textscan(var,'%s','Delimiter','.');

refxtree.(fields{:}) не работает, потому что MaterialStreamObjects содержит массив ячеек, к которому я хочу обратиться к 8-й ячейке, а затем продолжить путь по структуре.

В конце я хочу получить и установить значения полей.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2011

Вы можете определить анонимную функцию для навигации по этому конкретному виду структуры в форме top.field1.field2.field3{item}.field4.field5.field6.field7 (в дополнение: действительно ли необходимо иметь такую ​​сложную структуру?).

getField = @(top,fields,item)top.(fields{1}).(fields{2}).(fields{3}){item}.(fields{4}).(fields{5}).(fields{6}).(fields{7})

setField = @(top,fields,item,val)subsasgn(top.(fields{1}).(fields{2}).(fields{3}){item}.(fields{4}).(fields{5}).(fields{6}),struct('type','.','subs',fields{7}),val);

Выиспользуйте функции, вызывая

fieldValue = getField(refxtree,fields,8);
setField(refxtree,fields,8,newFieldValue);

Обратите внимание, что для fields требуется семь элементов.Если вы хотите обобщить вышесказанное, вам придется динамически создавать вышеприведенные функции

0 голосов
/ 01 октября 2011

В этом случае проще использовать EVAL:

str = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';

%# get
x = eval(str)

%# set
evalc([str ' = 99']);
0 голосов
/ 29 сентября 2011

Вам необходимо создать соответствующий ввод для subsref, возможно, используя substruct. Посмотрите на помощь MATLAB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...