MATLAB从netcdf文件的子集读取

时间:2017-10-25 16:14:26

标签: matlab netcdf

我有每小时风速的大型netcdf文件(684(西向东)乘447(南到北)数据点72(小时)。因此,单个文件的阵列为684x447x72我和#39;每年读取122个。我连接每年72小时和#个文件。所以,最后我每年有一个684x447x(72x122)数组。我需要读取文件中正好一半的数据点(西方情节)并绘制数据,然后读取另一半数据点(东部情节)并绘制数据。我不了解如何管理读取这些数据点。

以下是我在阅读循环中尝试过的内容:" var80speed"是684x447x72。 " nametest"是我的.nc路径和文件。 [1 1 1]是起始位置的向量?在.nc文件的起始读取位置左下角或右上角?如果684是西向东的,因为它在每个文件中的.nc头信息中说明,那么我似乎应该准确读取第一个图中的一半数据点和所有北 - 南点,然后这个改为684/2为开始,684为结束做第二个情节?这里的任何帮助非常感谢!

var80speed = single(cat(3,var80speed, ncread(nametest,myVarName,[1 1 1], [ 684/2 447 72 ])));

%循环代码以读取.nc文件:

for kk = 1:numyrs
    for ii = 1:(numrowsfilestoread(1,kk))
        infiletest = strcat(files2test(filestoread(ii,kk),:),'.nc');
        nametest = fullfile(pathname,infiletest);
        disp(infiletest);
        ncidt = netcdf.open(nametest);
        var80speed = single(cat(3,var80speed, ncread(nametest,myVarName,[1 1 1], [684/2 447 72])));
        %obtain mean of filelength period considered
        netcdf.close(ncidt);
        fname = strcat(num2str(years(kk)),'_80wspeed_spd');
        path = 'J:\\MATLAB\READ_netcdf_TTnc files\outfiles_text\';
        pathfile = strcat(path,fname);
        if ii == 61 % save middle of year
            savefast(pathfile,'var80speed');
            var80speed = []; 
        end
    end
    load(pathfile,'var80speed');
    var80speed2 = var80speed;
    var80speedall = cat(3,var80speed,var80speed2);
    clear var80speed;
    clear var80speed2;
    var80speed = []; var80speed2 = [];
    savefast(pathfile,'var80speedall');
 end

1 个答案:

答案 0 :(得分:0)

在给出更多信息之前,我会给你一些问题的部分答案。我将使用Matlab multidimention syntax。:

专注于此部分
ncread(nametest,myVarName,[1 1 1], [ 684/2 447 72 ])

这将从索引(1,1,1)开始,读取342行,447列,72页(小时)。如果您对尺寸的假设是正确的,那么这应该是" western"文件中所有时间的数据。

获得"东部"你会这样做:

ncread(nametest,myVarName,[684/2+1 1 1], [ 684/2 447 72 ])

这将从第343行(东部开始),第1列,第1页(小时)开始,并读取相同数量的行,列和&以前的页面。

注意:从ncread docs开始,最后一个参数是count

  

长度为N的向量,指定沿着要读取的元素数   相应的尺寸。如果计数的特定元素是Inf,   ncread读取数据直到相应维度结束。

因此,在每次读取相同数量的数据时,这不会在West和East调用ncread之间发生变化。但是,您可以使用Inf代替数字。