使用NaN的预分配矩阵在索引循环中的订阅分配维度不匹配

时间:2013-01-09 19:15:22

标签: matlab loops csv indexing nan

我正在处理气象数据集,需要从许多csv文件中提取一列,并将结果编译成新文件。我有一个月的工作,但脚本遇到较短的月份(订阅的分配维度)时会卡住 不匹配)。但是,有意义的是,我希望它只是保留最初存在于占位符矩阵D中的NaN值。

这是脚本的问题部分,

%Convert dates to matlab date numbers and get number of rows
Date = datenum(Date{1, 1}, 'dd-mm-yyyy');
T = size(Date, 1);    

%# Preallocate a matrix to hold all the data, and add the date column
D = [Date, NaN(T, NumFile)];

%# Loop over the csv files, get the eleventh column and add it to the data matrix
for k = 1:NumFile
FileList = dir('*.csv');
NumFile = size(FileList,1);
    filename = FileList(k).name;
    disp(filename);
    %# Get the current file name
    CurFilePath = filename;

    %# Open the current file for reading and scan in the second column using numerical format
    fid1 = fopen(CurFilePath, 'r');
    CurData = textscan(fid1, '%*s %*s %*s %*s %*s %*s %*s %*s %f %*[^\n]', 'Delimiter', ',"', 'HeaderLines', 17, 'MultipleDelimsAsOne',true);
    fclose(fid1);

    %Add the current data to the cell array
    D(:, k+1) = CurData{1, 1};
end

那么,为了适应占位符矩阵D,如何将较短的月份强制为31天的大小。

1 个答案:

答案 0 :(得分:3)

当您在一个维度中使用冒号运算符分配D时,Matlab必须假设您正在分配行中的所有元素。要修复它,只需用1:numberOfDaysInMonth交换冒号。这样Matlab将只分配你指定的值的数量,并保持其余的不变,在这种情况下为Nan。

numberOfDaysInMonth您可以计算为size(CurData{1, 1},1)

总之,在脚本中用倒数第二行交换:

%Add the current data to the cell array
numberOfDaysInMonth = size(CurData{1, 1},1);
D(1:numberOfDaysInMonth, k+1) = CurData{1, 1};