【问题标题】:Matlab: how to rename a sub-fieldMatlab:如何重命名子字段
【发布时间】:2014-04-01 22:17:18
【问题描述】:

让我这样描述这个问题。我有一个 .mat 文件,如果我打开它,它包含一个 1x10 结构数据。在每个数据中,它都有一个名为 res 的 1x5 结构(或字段)。在 res 中,它有一个名为 foo 的 1x1 结构(或字段)。因此,我有 ixj 个 data(i).res(j).foo 副本。

无论如何我可以更改此 foo 的名称吗?说我希望所有 data(i).res(j).foo 成为 data(i).res(j).bar

我确实在互联网上搜索过,并尝试了几种方法(添加和删除字段、创建临时字段、使用 cell2field 或 fieldtofile 等),但都没有奏效。最常见的返回错误是“不同结构之间的下标赋值”。

请帮忙,提前谢谢!

【问题讨论】:

  • 为什么不能复制到新名字,然后剪掉之前的?
  • 很抱歉没有把自己解释清楚。请看下面,你就知道了。

标签: matlab


【解决方案1】:

最安全的方法可能是循环两次数据,第一次为每个子字段创建一个新的字段栏,如data(i).res(j).bar=data(i).res(j).foo,然后第二次删除旧字段,如data(i).res(j) = rmfield(data(i).res(j),'foo')

【讨论】:

  • 您可能会使用列表的力量失去内部循环:[data(i).res.bar] = data(i).res.foo;rmfield 适用于结构数组,因此也不需要内部循环。
  • 谢谢 Notlikethat,我试过data(i).res = rmfield(data(i).res,'foo'),它奏效了。可惜data(i).res(j) = rmfield(data(i).res(j),'foo')不行,抱怨Subscripted Assignment between dissimilar structures.
【解决方案2】:

感谢 caoy 和 NotLikeThat。我终于得出结论了。

data2 = data
for i=1:10
    for j = 1:5
        data(i).res(j).bar = data2(i).res(j).foo;
    end
    data(i).res = rmfield(data(i).res, 'foo');
end

运行此脚本后,我可能需要删除 i、j 和 data2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2022-11-14
    • 2014-10-19
    • 2012-02-06
    • 2021-07-14
    • 2011-03-29
    相关资源
    最近更新 更多