基于导入的文件名生成MATLAB变量名
我正在从本地目录导入一些文件,这些文件以以下字符和文件扩展名结尾,使用基于导入的文件名生成MATLAB变量名,matlab,variables,rename,Matlab,Variables,Rename,我正在从本地目录导入一些文件,这些文件以以下字符和文件扩展名结尾,使用 files = dir('*_eta.txt'); for file = files' load(file.name) end 将文件加载到工作区,从而生成预期结果 现在,我希望通过将第二列拆分为另一个变量来转换这一个变量(包含两列,3003行) 我已经有了执行此转换的代码,但是我想在文件名之后命名新变量,这次省略了“_eta”。 我曾尝试在who('*\u eta')循环中使用extractBefore(file
files = dir('*_eta.txt');
for file = files'
load(file.name)
end
将文件加载到工作区,从而生成预期结果
现在,我希望通过将第二列拆分为另一个变量来转换这一个变量(包含两列,3003行)
我已经有了执行此转换的代码,但是我想在文件名之后命名新变量,这次省略了“_eta”。
我曾尝试在who('*\u eta')
循环中使用extractBefore(file.name,''u eta')
,但发现我无法生成我想要的结果
我很欣赏MATLAB(或任何编程语言)中不推荐使用动态变量名,但我很惊讶,我在访问变量、减少变量名和执行函数方面做了这么多的努力
此外,我希望将它们保留为数组,而不是将它们组合到单元格或结构中
任何帮助都将受到感激
编辑:动机-这是我目前正在做的:
t = (0:0.01:10);
load('MPConst_eta.txt'); load('MVConst_eta.txt');
load('KVPConst_eta.txt'); load('KVVConst_eta.txt');
load('SLSPConst_eta.txt'); load('SLSVConst_eta.txt');
load('MPRamp_eta.txt'); load('MVRamp_eta.txt');
load('KVPRamp_eta.txt'); load('KVVRamp_eta.txt');
load('SLSPRamp_eta.txt'); load('SLSVRamp_eta.txt');
for k = 1:3
MP_Const(:,k) = MPConst_eta((k-1)*length(t)+1:k*length(t),2);
MV_Const(:,k) = MVConst_eta((k-1)*length(t)+1:k*length(t),2);
KVP_Const(:,k) = KVPConst_eta((k-1)*length(t)+1:k*length(t),2);
KVV_Const(:,k) = KVVConst_eta((k-1)*length(t)+1:k*length(t),2);
SLSP_Const(:,k) = SLSPConst_eta((k-1)*length(t)+1:k*length(t),2);
SLSV_Const(:,k) = SLSVConst_eta((k-1)*length(t)+1:k*length(t),2);
MP_Ramp(:,k) = MPRamp_eta((k-1)*length(t)+1:k*length(t),2);
MV_Ramp(:,k) = MVRamp_eta((k-1)*length(t)+1:k*length(t),2);
KVP_Ramp(:,k) = KVPRamp_eta((k-1)*length(t)+1:k*length(t),2);
KVV_Ramp(:,k) = KVVRamp_eta((k-1)*length(t)+1:k*length(t),2);
SLSP_Ramp(:,k) = SLSPRamp_eta((k-1)*length(t)+1:k*length(t),2);
SLSV_Ramp(:,k) = SLSVRamp_eta((k-1)*length(t)+1:k*length(t),2);
end
正如您所看到的,对于不同的文件,同一操作会有很多重复,而且还会有很多重复,所以希望尝试以一种智能的方式来完成。试试看
A = load(file.name);
varname = file.name(1:end-8); % remove _eta.txt
eval([varname,'=A(:,2)']) % save the second column in the variable with name 'varname'
它的速度很慢,也不是很优雅,但它会成功的
编辑:或者,您可以使用结构并将每个文件保存在一个字段中:
files = dir('*_eta.txt');
all_data = struct;
for i = 1:numel(files)
filename = files(i).name;
dummy = load(filename)
fieldname = filename(1:end-8); % remove _eta.txt
for i = 1:3
% Use the file name to create a field of the structure and save your things in the kth column
all_data.(fieldname)(:,k) = dummy((k-1)*length(t)+1:k*length(t),2);
end
end
当然,预先分配东西会让事情变得更快
A = load(file.name);
varname = file.name(1:end-8); % remove _eta.txt
eval([varname,'=A(:,2)']) % save the second column in the variable with name 'varname'
它的速度很慢,也不是很优雅,但它会成功的
编辑:或者,您可以使用结构并将每个文件保存在一个字段中:
files = dir('*_eta.txt');
all_data = struct;
for i = 1:numel(files)
filename = files(i).name;
dummy = load(filename)
fieldname = filename(1:end-8); % remove _eta.txt
for i = 1:3
% Use the file name to create a field of the structure and save your things in the kth column
all_data.(fieldname)(:,k) = dummy((k-1)*length(t)+1:k*length(t),2);
end
end
当然,预先分配东西会使事情更快@conquisitor:结构化方法比
eval
好得多。请尽可能避免使用eval
。请查看以了解原因。请尝试for i=1:numel(文件),file=files(i).name;虚拟=加载(文件);fieldname=文件(1:end-8)。。。,结束
@jrglez-谢谢你,我刚刚也解决了这个问题(因此删除了评论!)。我对您的上述解决方案有一个问题,即当写入all_数据结构时,只有一个(最后一个)字段名出现?@Conquistador:这对我来说很好。你能粘贴那部分代码的一段吗?确保在循环的每一步中都没有覆盖结构。@Conquistador,你只做了循环的最后一步(对于i=numel(文件)
),但对于i=1:numel(文件)@Conquistador:结构方法比eval
好得多。请尽可能避免使用eval
。请查看以了解原因。请尝试for i=1:numel(文件),file=files(i).name;虚拟=加载(文件);fieldname=文件(1:end-8)。。。,结束
@jrglez-谢谢你,我刚刚也解决了这个问题(因此删除了评论!)。我对您的上述解决方案有一个问题,即当写入all_数据结构时,只有一个(最后一个)字段名出现?@Conquistador:这对我来说很好。你能粘贴那部分代码的一段吗?确保在循环的每一步中都没有覆盖结构。@征服者,您只做了循环的最后一步(对于i=numel(文件)
),但对于i=1:numel(文件)