我正在使用一个大型预定义的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'.
有什么想法吗?我无法更改原始字段名。
答案 0 :(得分:1)
字段名称,指定为字符串。有效字段名称以字母开头,可以包含字母,数字和下划线。字段名称的最大长度是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)
要尝试两件事。
将其转换为有效的数据类型:使用fieldnames
和struct2cell
弹出该单元格中的名称和所有数据元素。然后,您可以手动在该列表中查找字段名称以获取索引到单元格数组中。您可以编写一个小类,将这两个包装在字段中,并且行为就像一个允许任意字段名称的结构,这将与大多数期望结构的代码兼容。或者,如果您可以接受传递引用行为和不同语法,请将它们放在containers.Map
中,这允许任意字符串作为键。
或者您可以下载到MEX并编写自己的getfieldunsafe()
,这样可以将伪造的字段名称与这些虚假结构一起使用。尝试调用mxGetField
,看看它是否适用于虚假字段名称。如果没有,请手动在MEX函数中查找结构字段列表中的字段名称,然后使用mxGetFieldByNumber
获取数据。请参阅http://www.mathworks.com/help/matlab/access-data.html。
将其转换为有效对象可能是最好的。如果struct2cell
和fieldnames
给您带来麻烦,您可以只为转换下拉MEX,以便从伪结构中获取数据一次。