我有很多这样的.txt文件:“u1.txt”,“i3.txt”,“p10.txt”...如何将所有这些文件加载到matlab,这些变量如下:“u1” ,“u2”......“p1”......这是我的代码:
clc, clear all
%% loading data
for j=0:3
switch j
case 0
variable='i';
case 1
variable='u';
case 2
variable='p';
case 3
variable='q';
end
for i=0:15
name = strcat(variable, int2str(i), '.txt')
fid=fopen(name,'r');
data=textscan(fid,'%*s%*s%s%s%s%*s','HeaderLines',10,'CollectOutput',1);
fclose(fid);
data=strrep(data{1},',','.');
data=cellfun(@str2num, data);
end
end
问题在于可变数据 - 如何在每次循环后将此变量更改为:“u1”,“u2”......“p1”......
答案 0 :(得分:2)
您可以使用变量名u1
u2
等。但我强烈建议您不要这样做。然后,这些连续变量u1
到u15
完全是个体变量,基本上matlab不能迭代这些变量。为此,我将使用包含单元格数组的结构。使用此行指定:
allData.(variable){i}=data
要获取您的数据,而不是u1
使用allData.u{1}
。这些是要编写的更多字符,但是使用这些结构化数据会在使用数据时产生更简单的代码。
//代码:
for j=0:3
switch j
case 0
variable='i';
case 1
variable='u';
case 2
variable='p';
case 3
variable='q';
end
for i=0:15
name = strcat(variable, int2str(i), '.txt')
fid=fopen(name,'r');
data=textscan(fid,'%*s%*s%s%s%s%*s','HeaderLines',10,'CollectOutput',1);
fclose(fid);
data=strrep(data{1},',','.');
data=cellfun(@str2num, data);
allData.(variable){i}=data;
end
end
答案 1 :(得分:1)
使用eval。
例如:
x = input('Enter the name of the new variable: ','s');
eval([x,'=0:4;']);
在你的情况下:
variablename = strcat(variable,int2str(i));
eval([variablename,'=cellfun(@str2num,',variablename,')'];
这是一本很好的读物:Creating variables on the run
答案 2 :(得分:1)
你可以使用eval
来执行此操作:
eval([name '=textscan(fid,'%*s%*s%s%s%s%*s','HeaderLines',10,'CollectOutput',1);']);
我认为语法是正确的,但我不确定。您可能需要稍微使用它才能使其工作,这首先使用eval
是一个巨大的缺点。更不用说语法分析器无法使用它,使调试更加困难。
我的建议是利用MATLAB的功能来使用dynamic fieldnames。
data.(name)=textscan(fid,'%*s%*s%s%s%s%*s','HeaderLines',10,'CollectOutput',1);
更干净,更容易调试。
我的另一个建议是,您首先要评估为什么需要使用此命名方案。创建数组(数字或单元格)并使用该数字ID作为索引而不是将其包含在变量名称中会更容易。