2012-04-03 69 views
2

我有一個名爲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不適用於此。

謝謝:)

回答

5

那麼,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

1

您可以使用動態字段名:

someStruct.(someField) = DataToBeEntered; 

其中someField是一個變量保存字段名稱,但你將有你的IndexString解析到單個字段名和索引。

+1

動態字段名稱本身並不能解決問題,因爲IndexString可能還包含單元格數組索引,而不僅僅是struct的字段名。我想我需要編寫一個函數,通過遞歸地遍歷結構和單元格數組,將數據分配給適當的字段或適當的單元格。 – nrz 2012-04-03 19:53:45