2015-07-10 54 views
2

我希望能夠在MATLAB(r2014a)中動態地將字段分配給結構數組,包括層次結構。除了通過以下示例,我不確定如何最好地描述問題。動態分配具有層次結構的字段名稱

我知道如何做到這一點:

field_name1 = 'bar1'; 
field_name2 = 'bar2'; 
% ... etc. 
foo.(field_name1) = pi; 
foo.(field_name2) = exp(1); 
% ... etc. 

結果變量foo與領域bar1bar2的結構。

我希望能夠做的是:其中取決於以前的狀態

field_name1 = 'bar1'; 
field_name2 = 'bar2'; 
% ... etc. 
if true_false_statement 
    extra_level = ''; 
else 
    extra_level = 'baz.'; 
end 
foo.([extra_level field_name1]) = pi; 
foo.([extra_level field_name2]) = exp(1); 
% ... etc. 

,字段可以存儲在結構的頂層或者一個子場下。 (注意,如果我從頭開始做這件事,我會設計不同的事情來避免這個問題,但是我修改了一些代碼,這是一個更大的工作流程中的中間步驟,所以我必須保留這些數據。結構一致)

目前,代碼看起來是這樣的:

field_name1 = 'bar1'; 
field_name2 = 'bar2'; 
% ... etc. 
if true_false_statement 
    foo.(field_name) = pi; 
    foo.(field_name) = exp(1); 
    % ... etc. 
else 
    foo.baz.(field_name) = pi; 
    foo.baz.(field_name) = exp(1); 
    % ... etc. 
end 

或許罰款一個兩個領域,但也有很多領域,這會導致大量的複製/粘貼代碼。我試圖讓extra_level爲空字段,並且我已經嘗試使的形式爲*.*,但是這兩個選項都會引發錯誤,因爲結果不是有效的變量名稱。

有沒有很好的方法來做到這一點?

+1

有趣的問題。我期待着答案。 – rayryeng

回答

5

我能想到的最簡單的方式來實現您期望的使用(中間代碼塊)是使用setfield(這幾乎是最近的subsasgn的包裝),並且空單元格數組擴展爲無(東西我answered about in the past和我喜歡稱之爲功能):

>> foo = struct(); 
>> extra_level = {}; 
>> foo = setfield(foo,extra_level{:},'bar1',1) 
foo = 
    bar1: 1 

>> extra_level = {'baz'}; 
>> foo = setfield(foo,extra_level{:},'bar2',2) 
foo = 
    bar1: 1 
    baz: [1x1 struct] 

>> foo.baz.bar2 
ans = 
    2 
+0

這是一個很棒的訣竅!我現在可以在我的功能中刪除大約四分之一的行,都是多餘的。 – craigim

+0

我發佈了一個[後續問題](http://stackoverflow.com/questions/31385908/dynamically-check-for-existence-of-structure-field-name-with-hierarchy)關於如何隨後檢查爲領域的存在。有什麼想法嗎? – craigim