在循环中以不同方式命名每个变量

时间:2014-02-06 00:02:13

标签: matlab variables for-loop

我创建了一个.dat文件名文件。我想在MATLAB中读入该列表中的每个文件,并为数据指定一个不同的名称。目前,每次迭代都会覆盖最后一次。

我发现很多人都给出了这个答案:

for i=1:10
  A{i} = 1:i;
end

然而,它不适用于我的问题。这就是我正在做的事情

flist = fopen('fnames.dat'); % Open the list of file names

nt = 0; % Counter will go up one for each file loaded
while ~feof(flist) % While end of file has not been reached
    for i = 1:6 % Number of filenames in the .dat file

    % For each file
    fname = fgetl(flist); % Reads next line of list, which is the name of the next data file
    disp(fname); % Stores name as string in fname

    nt = nt+1; % Time index

    % Save data

    data{i} = read_mixed_csv(fname, '\t'); % Reads in the CSV file% Open file
    data{i} = data(2:end,:); % Replace header row

    end
end

代码运行时没有错误,但只保存了一个data变量。

我的fnames.dat包含: IA_2007_MDA8_O3.csv IN_2007_MDA8_O3.csv MI_2007_MDA8_O3.csv MN_2007_MDA8_O3.csv OH_2007_MDA8_O3.csv WI_2007_MDA8_O3.csv

如果可能的话,我真的想将data命名为更直观。与第一个文件的IA类似,第二个文件的IN类似,依此类推。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

循环的最后一行是问题:

data{i} = data(2:end,:);

我不知道究竟发生了什么,我没有运行你的代码,但data(2:end,:)指的是倒数第二个数据集,而不是倒数第二行。

尝试:

thisdata = read_mixed_csv(fname, '\t');
data{i} = thisdata(2:end,:);

答案 1 :(得分:1)

如果要跟踪哪个数据来自哪个文件,请保存另一个名称为

的单元格数组。
thisdata = read_mixed_csv(fname, '\t');
data{i} = thisdata(2:end,:);
names{i} = fname(1:2); % presuming you only need first two letters.

如果您需要文件名的特定部分并不总是相同的长度,请查看strtokfileparts。然后,您可以使用strcmp之类的内容检查单元格数组names,以查找标记为IA的数据或存储的数据。

答案 2 :(得分:0)

正如@Daniel所提到的,在单元格数组中存储各种大小数据的简单方法。

data {1} = thisdata(2:end,:)

但是,如果名称非常重要,您可以考虑使用结构。例如:

dataStruct(1).numbers= thisdata(2:end,:);
dataStruct(1).name= theRelevantName

当然你也可以将它们添加到单元格数组中:

dataCell{1,1} = thisdata(2:end,:);
dataCell{1,2} = theRelevantName