2012-09-25 91 views
2

我與具有包含空格和奇怪的字符,如幾個字段名的大型預定義的Matlab的結構工作MATLAB結構的字段名:分配值包含空格

Pending Equity > T: [20000x1 double] 

我可以看到數據精細:

>> r.('Pending Equity > T')(1) 

ans = 

    0 

但是,我不能指定一個新值:

>> r.('Pending Equity > T')(1) = 5 
??? Invalid field name: 'Pending Equity > T'. 

任何想法?我無法更改原始字段名稱。

+1

我不認爲你正在使用一個結構,而是一個對象。你可以運行'class(r)'併發布輸出嗎? – Jonas

+2

不幸的是,它確實是一個結構:>> class(r) ans = struct –

回答

1

struct documentation

字段名稱,指定爲字符串。有效的字段名稱以字母開頭,可以包含字母,數字和下劃線。字段名稱的最大長度是namelengthmax函數返回的值。

所以沒有空格(也沒有><!:;,等),請嘗試使用下劃線而不是空格。

如果您確定可以讀出數據,那麼它是如何構建的?正如你從上面看到的,這種數據結構不被支持。

+0

不是肯定的。這是對MS SQL Server數據庫查詢的響應。這些都是我正在處理的古老遺留系統。 –

+0

難道你不能重新命名之前的轉換事情放入一個matlab結構? –

+0

Nah,我真的無法編輯轉換事項 - 我必須用來查詢數據庫的方法等,都是預先構建的,並且很難進行更改。在大公司工作的麻煩...... –

0

很奇怪有人能夠創建這樣的結構。較舊版本的Matlab,也許?無論如何,唯一想到的是功能setfield。但有可能它會給你「無效的字段名稱」錯誤。

+0

是的,正如我在上面的答案中所評論的那樣,這些都是我正在使用的古老遺留系統。這是啓動時的matlab版本控制:版本7.5.0.338(R2007b)。我確實得到了setfield的「無效字段名稱」錯誤。 2007年8月9日 –

+0

'setfield'是否工作? – Dima

+0

我編輯了我的上面的評論,但沒有 - setfield導致了另一個「無效的字段名稱」錯誤,如你所預測的。 –

1

那麼你可以做一個新的struct,這是r副本,但有效的字段名:

names = fieldnames(r); 
newnames = genvarname(names); 

for ii = 1:numel(names) 
    new_r.(newnames{ii}) = r.(names{ii}); 
end 

這將使你的東西分配給你指明道路上的一切領域。

它有一個明顯的缺點,例如'Pending Equity > T'等字段名將被重命名爲不太漂亮的'PendingEquity0x3ET'

0

兩件事情要嘗試。

將其轉換爲有效的數據類型:使用fieldnamesstruct2cell彈出該單元格的名稱和所有數據元素。然後,您可以手動查找該列表中的字段名稱以獲取單元格數組中的索引。你可以編寫一個小類,將它們都包裝在字段中,並像一個允許任意字段名稱的結構一樣工作,這將與大多數期望結構的代碼兼容。或者,如果您可以接受傳遞引用行爲和不同語法,請將其粘貼到允許任意字符串作爲鍵的containers.Map中。

或者你可以下載到MEX並編寫你自己的getfieldunsafe(),它可以讓你在這些假結構中使用僞造的字段名稱。嘗試撥打mxGetField並查看它是否可以與僞造字段名稱一起使用。如果沒有,請使用MEX功能在結構的字段列表中手動查找字段名稱,然後使用mxGetFieldByNumber獲取數據。請參閱http://www.mathworks.com/help/matlab/access-data.html

將它轉換爲有效的對象可能是最好的。如果struct2cellfieldnames給你帶來麻煩,你可以下載MEX來進行轉換,以便一次將數據從僞結構中取出。