将大量数据导入Matlab

时间:2014-08-22 12:01:17

标签: matlab import

我有很多这样的.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”......

3 个答案:

答案 0 :(得分:2)

您可以使用变量名u1 u2等。但我强烈建议您不要这样做。然后,这些连续变量u1u15完全是个体变量,基本上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作为索引而不是将其包含在变量名称中会更容易。