如何从单元格中创建结构字段名称

时间:2012-12-18 19:43:50

标签: matlab

我有一个需要读入matlab的文本文件。我想使用结构在Matlab中实现类似java LinkedHashMap的东西。我的文本文件是这样的

3-1 33.33 37.58

3-1 66.67 20.47

3-2 33.33 41.64

3-2 66.67 24.42

我将整个文件读入数组[a,x,y],其中a是包含3-1 ad 3-2的单元格数组

我需要结构将其字段名称设置为(1)或(2)但不幸的是matlab给了我错误。原因是我需要检查例如a(1)是否已经是结构字段名称我将值连接到先前的值;如果没有,请使用所需的值创建一个新的字段名称。代码是:

[a,x,y]=textread('mytxt.txt', '%q%f%f','commentstyle','matlab');

s.a(1)=[x(1),y(1)];

for j=2:length(a)

    if isfield(s,a(1))==0

        s.a(j)=[x(j),y(j)];

     else

        temp = s.a(j);

        C = concat(1,temp,[x(j),y(j)];

        s.a(j) = C

    end

end 

1 个答案:

答案 0 :(得分:2)

据推测,您希望将 s 作为具有 3-1,3-2,...,3-n 字段的结构。我还认为你想用MATLAB的dynamic field names创建。

要通过单元格数组 a 中的单元格动态访问字段,您需要执行以下操作:

s.(a{j}) = [x(j), y(j)];

记下括号()和大括号 {} 的不同用法。括号用于指示动态字段名称,如 s。(str),其中 str 是字符数组。大括号用于索引单元格数组 a ,如 a {j} 给出 a 中第j个单元格的字符数组。 / p>

最后,你提出的字段名称( 3-1,3-2,... 等)不是合法的MATLAB字段名,因为连字符' - '并且它们没有开始用一封信, [a-zA-Z] 。因此,您需要将连字符替换为另一个字符,例如下划线,并在建议的字段名称的开头附加一个字母。

  1. 使用 strrep 替换连字符,如

    α= strrep(一, ' - ', '_');

  2. 在字段名称的开头附加一个字母

    a = cellfun(@(str)['a_'str],a,'uniformoutput',0)

  3. 这项工作可以在您将文件读入矩阵后立即完成 a x y