2

我正在使用一个大型的预定义 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

4 回答 4

1

结构文档

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

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

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

于 2012-09-25T15:16:48.070 回答
1

好吧,您可以创建一个 new 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'.

于 2012-09-25T19:39:23.933 回答
0

有两件事要尝试。

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

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

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

于 2012-09-26T07:02:36.210 回答
0

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

于 2012-09-25T15:22:15.020 回答