基于导入的文件名生成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(文件)