String 使用现有字符串在MATLAB中重命名结构

String 使用现有字符串在MATLAB中重命名结构,string,matlab,data-structures,struct,String,Matlab,Data Structures,Struct,我在MATLAB中有一个名为dat的结构。我想将dat重命名为现有字符串 Existing_str='NewName' $(Existing_str)=dat 这失败了,因为我认为MATLAB不允许我以这种方式使用美元符号。下面的代码创建一个dat副本,字面上称为Existing_str,并在过程中销毁现有的_str Existing_str=dat 下面的代码生成了一个collosal空结构,它显然不是一个副本 eval(Existing_str)=dat 在我实际要执行的任务中,我事先

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

Existing_str='NewName'
$(Existing_str)=dat
这失败了,因为我认为MATLAB不允许我以这种方式使用美元符号。下面的代码创建一个dat副本,字面上称为Existing_str,并在过程中销毁现有的_str

Existing_str=dat
下面的代码生成了一个collosal空结构,它显然不是一个副本

eval(Existing_str)=dat

在我实际要执行的任务中,我事先不知道现有任务的名称,因此这不是一个解决方案。

您的“评估”几乎完成了。你想要的是:

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

这是因为您正在方括号内编写字符串。如果只查看结果字符串,它看起来像
NewName=dat
eval命令简单地告诉Matlab计算字符串,就像您在命令行中键入字符串一样。

您可以使用动态字段命名(Bas的建议),并避免
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}确保它不会覆盖现有数据。

感谢您的解释。非常有用。虽然这确实回答了这个问题,但我认为教初学者如何
eval
并不好。真正的问题是为什么要重命名变量,通常有更好的方法来实现相同的结果。例如,您可以执行
s.(name)=dat
,其中
s
是一个
struct
@BasSwinckels,我正在尝试重命名一个struct。我不认为这是一个变量,尽管我可能错了。我这样做是因为我将生成多个结构,在初始实例中称为dat,我想保存原始结构。请不要这样做。在大多数情况下,使用eval表示代码错误。通过选择正确的数据结构,通常可以避免使用重命名变量。您可能可以使用单元格数组或结构来保存信息。@BasSwinckels我正在从一堆netcdf文件中挑选所需的数据,并将它们粘贴到名为dat的结构中的各种数组中。然后,我想重命名该结构,以防止在加载下一批数据时被覆盖。我想我可以将“dat”结构粘贴到另一个结构中(比如“all_dat”),但是我仍然需要重命名dat结构,否则下次我将数据加载到all_dat时,它将被覆盖;很少有好的理由像这样重命名变量,如果您使用大量的
eval
,很可能您将来会为自己做更多的工作。@nkjt我正在从一堆netcdf文件中挑选我需要的数据,并将它们粘贴到名为dat的结构中的各种数组中。然后我想重命名结构,以防止在加载下一批数据时被覆盖。这正是我以非常基本的方式提问的原因。我已经读了好几遍了,只是有点理解它的意思,虽然我很确定它与我正在做的事情或帮助我无关。我不能很好地提出详细的问题以得到一个好的答案,我对回答感到困惑。看起来你认为我只是在阅读文件,而我不是。我正在挑选特定的特征(例如,此处数组的最大值,此处变量的值),并将它们放入这些值的向量数组中(例如,名为RH的变量的最大值进入dat.RH_max)。我对原始文件名不感兴趣,它们的形式为“commonstring”+str2num(数字)。我确信我没有清楚地表达这一点,使你们能够用它做任何有用的事情,但我想尝试证明为什么这个答案对我没有帮助。