2011-09-29 91 views
3

如何訪問動態字段名的結構如下路徑:Matlab的動態字段名的結構與電池陣列

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

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

refxtree.(fields{:})不會因爲MaterialStreamObjects工作包含單元陣列,而我要訪問的第8單元格,然後繼續沿着結構路徑走下去。

最後我想獲取並設置字段值。

+0

'refxtree(場{:})'止跌即使在那裏沒有單元陣列也不行。 – Jonas

回答

0

您需要建立適當的輸入到subsref,可能使用substruct。看看MATLAB的幫助。

+0

在[這個答案](http://stackoverflow.com/a/16718354/232888)有一個很好的例子['subsref'](http://www.mathworks.co.uk/help/matlab/ ref/subsref.html)和['substruct'](http://www.mathworks.de/de/help/matlab/ref/substruct.html)函數,這些函數可能很容易被改進以完成問題的要求。 – quazgar

0

您可以定義一個匿名函數來導航表格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

在這種情況下,很容易只使用EVAL:

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

%# get 
x = eval(str) 

%# set 
evalc([str ' = 99']);