2012-09-25 97 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来进行转换,以便一次将数据从伪结构中取出。