【问题标题】:Renaming a structure in MATLAB using an existing string使用现有字符串在 MATLAB 中重命名结构体
【发布时间】:2015-01-31 11:06:07
【问题描述】:

我在 MATLAB 中有一个名为 dat 的结构。我想将 dat 重命名为现有字符串。

Existing_str='NewName'
$(Existing_str)=dat

这失败了,因为我认为 MATLAB 不允许我以这种方式使用美元符号。下面的代码创建了一个 dat 的副本,字面意思是 Existing_str,并在进程中销毁 Existing_str。

Existing_str=dat

虽然下面的代码生成了一个明显不是副本的巨大空结构!

eval(Existing_str)=dat

在我实际尝试执行的任务中,我事先不知道existing_str 的名称,所以这不是解决方案。

【问题讨论】:

  • 您可能想告诉我们实际的任务是什么;像这样重命名变量很少有充分的理由,如果您使用大量 eval,那么您将来可能会为自己做更多的工作。
  • @nkjt 我正在从大量 netcdf 文件中挑选出我需要的数据,并将它们粘贴到名为 dat 的结构中的各种数组中。然后我想重命名结构以防止在加载下一批数据时被覆盖。

标签: string matlab data-structures struct


【解决方案1】:

你可以使用动态字段命名(巴斯的建议),避免eval

例如,如果您刚刚使用某些自定义解析函数从文件 'somefile.ext' 加载了结构 dat

filename = 'somefile.ext'; % presume you actually have a list of files from dir or ls
dat = yourfunction(filename);
[~, name, ~] = fileparts(filename);
alldat.(name)=dat;

这相当于:

alldat.somefile = dat;

除了我们刚刚自动从文件名中获取名称(在这种情况下只是通过剥离路径/扩展名,但您可以根据文件名的模式做其他事情)。

这样做的好处是,您可以使用具有字段alldat.file1, alldata.file2, alldat.file3 的结构,所有这些字段都有一个子字段,例如size,执行以下操作:

names = fieldnames(alldat)
for n = 1:length(names)
    alldat.(names{n}).mean = mean(alldata.(names{n}).size);
end

现在每个子结构都有一个字段mean,其中包含数据的平均值。如果你有一堆不同的命名结构,你需要eval 对它们做的所有事情,代码变得难以阅读和维护。

另一个选项是元胞数组。这是一个简单的技巧:

dat = % whatever you do to make this structure
alldat{end+1} = dat;

这只是将新的dat 附加到现有元胞数组的末尾。 {end+1} 确保它不会覆盖现有数据。

【讨论】:

  • 这正是我以非常基本的方式提问的原因。我已经读了好几遍了,虽然我很确定它与我正在做的事情或对我的帮助无关,但我只是理解它的含义。我不能很好地提出详细的问题来得到一个好的答案,并且被回答弄糊涂了。
  • 您似乎认为我只是在阅读我不是的文件。我正在挑选特定的特征(例如,这里数组的最大值,那里的变量值)并将它们中的每一个值放入这些值的向量数组中(例如,名为 RH 的变量的最大值进入 dat.RH_max ) 原始文件名对我来说并不感兴趣,它们的格式为“commonstring”+str2num(number)。我敢肯定,我没有足够清楚地表达这一点,让你能够用它做任何有用的事情,但我想尝试证明为什么这个答案对我没有帮助。
【解决方案2】:

你的 `eval' 就快到了。你想要的是:

eval([Existing_str '=dat;']);

这是有效的,因为您在方括号内编写了一个字符串。如果您只是查看生成的字符串,它看起来像 NewName=dat; eval 命令只是告诉 Matlab 评估字符串,就像您在命令行中键入它一样。

【讨论】:

  • 感谢您的解释。非常有用。
  • 虽然这确实回答了这个问题,但我认为向初学者教授eval 并不是一件好事。真正的问题是为什么要重命名变量,通常有更好的方法来实现相同的结果。例如,您可以使用s.(name) = dat,其中sstruct
  • @BasSwinckels 我正在尝试重命名一个结构。我不认为这是一个变量,尽管我可能错了。我这样做是因为我将生成多个结构,这些结构在初始实例中称为 dat,我想保存原始结构。
  • 请不要那样做。 在大多数情况下使用 eval 表示代码错误。通常可以通过选择正确的数据结构来避免重命名变量的使用。您也许可以使用元胞数组或结构来保存您的信息。
  • @BasSwinckels 我正在从大量 netcdf 文件中挑选出我需要的数据,并将它们粘贴到一个名为 dat 的结构中的各种数组中。然后,我想重命名结构以防止在加载下一批数据时被覆盖。我想我可以将“dat”结构粘贴到另一个结构中(比如“all_dat”),但是我仍然需要重命名 dat 结构,否则下次我将数据加载到 all_dat 时它会覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多