将值赋给包含空格的matlab结构字段名

时间:2012-09-25 15:04:16

标签: 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'.

有什么想法吗?我无法更改原始字段名。

4 个答案:

答案 0 :(得分:1)

来自struct documentation

  

字段名称,指定为字符串。有效字段名称以字母开头,可以包含字母,数字和下划线。字段名称的最大长度是namelengthmax函数返回的值。

所以没有空格(也不是><!:;,等),尝试使用下划线而不是空格。

如果你确定你可以很好地读出数据,那么它是如何构建的呢?从上面可以看出,不支持这种数据结构。

答案 1 :(得分: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'

答案 2 :(得分:0)

有人能够创建这样的结构是非常奇怪的。也许是旧版的Matlab?无论如何,唯一想到的是函数setfield。但是它可能会给你“无效的字段名称”错误。

答案 3 :(得分:0)

要尝试两件事。

将其转换为有效的数据类型:使用fieldnamesstruct2cell弹出该单元格中的名称和所有数据元素。然后,您可以手动在该列表中查找字段名称以获取索引到单元格数组中。您可以编写一个小类,将这两个包装在字段中,并且行为就像一个允许任意字段名称的结构,这将与大多数期望结构的代码兼容。或者,如果您可以接受传递引用行为和不同语法,请将它们放在containers.Map中,这允许任意字符串作为键。

或者您可以下载到MEX并编写自己的getfieldunsafe(),这样可以将伪造的字段名称与这些虚假结构一起使用。尝试调用mxGetField,看看它是否适用于虚假字段名称。如果没有,请手动在MEX函数中查找结构字段列表中的字段名称,然后使用mxGetFieldByNumber获取数据。请参阅http://www.mathworks.com/help/matlab/access-data.html

将其转换为有效对象可能是最好的。如果struct2cellfieldnames给您带来麻烦,您可以只为转换下拉MEX,以便从伪结构中获取数据一次。