2014-01-20 44 views
0

我有40個netcdf文件命名爲'lffd1961_V10M_Iberia.nc','lffd1962_V10M_Iberia'...'lffd2000_V10M_Iberia'。閱讀多個netcdf文件 - matlab

我想在同一個程序中打開所有的程序,在它們中獲得相同的變量,在該變量中應用一些公式,並創建40個新的netcdf文件,並修改該變量。

要打開40個文件,我已經開發了這個代碼,它的工作原理。

for yr=1961:2000 
inFile=strcat('lffd',num2str(yr),'_V10M_Iberia.nc'); disp(inFile) 
nc=netcdf.open(inFile,'NC_NOWRITE'); 
netcdf.close(nc) 
end 

現在我想獲得它們所有的變量號碼4。這個變量是一個三維矩陣(70x51x(8760或8784)) 事情是這樣的下一行,但有40年循環:

ws_1961(1962, etc, etc) = netcdf.getVar(nc,4); 

和它應該有我的工作區40名新的變量。 在此之後我想在所有的40個變量中應用該公式:

ws_80 = ws.*(log(z/alpha)/log(exp(1))/(log(10/alpha)/log(exp(1)))); 

並最終創建在每個文件我的新變量40個新的NetCDF文件。

類似的東西:

outFile=strcat('year',num2str(yr),'_80m.nc') 
ncid = netcdf.create(outFile,'CLOBBER'); 

dimid0 = netcdf.defDim(ncid,'longitude',nlon); % getvar number 1 
dimid1 = netcdf.defDim(ncid,'latitude',nlat); %getvar number 2 
dimid2 = netcdf.defDim(ncid,'time',nt); %getvar number 3 

varid0 = netcdf.defVar(ncid,'longitude','double', dimid0); 
varid1 = netcdf.defVar(ncid,'latitude','double', dimid1); 
varid2 = netcdf.defVar(ncid,'time','double', dimid2); 
varid3 = netcdf.defVar(ncid,'ws_80','double', [dimid0 dimid1 dimid2]); 

netcdf.putAtt(ncid,varid0,'units','degrees_east'); 
netcdf.putAtt(ncid,varid0,'long_name','longitude'); 

netcdf.putAtt(ncid,varid1,'units','degrees_north'); 
netcdf.putAtt(ncid,varid1,'degrees_north','latitude'); 

netcdf.endDef(ncid); 

netcdf.putVar(ncid,varid0,longitude); 
netcdf.putVar(ncid,varid1,latitude); 
netcdf.putVar(ncid,varid2,time); 
netcdf.putVar(ncid,varid3,ws80); 

這是我很難解釋這一點,所有的你明白所以請舒適問任何你想要的方式。

+0

您在哪一部分卡住並需要幫助?我不清楚你的方程是否需要來自一個變量的所有文件的所有數據。如果不是,你最好一次處理一個文件(讀取,應用等式,寫入)。使用ncread,ncinfo,ncwriteschema和ncwrite等更高級別的函數可能會更容易。 –

+0

你能幫我分零件嗎? 我的第一個循環,打開我所有的.nc文件都能正常工作。 現在我需要一些循環來獲得第四個位置的所有變量'netcdf.getVar(nc,4);'在每個文件。 我的下一步是在我的工作區中有40個變量(每個文件之一)。 – rochinha44

+0

您的版本是否具有ncread功能?再次,你是否真的需要全部40個變量來應用這個方程?或者你可以一次將方程應用於一個變量嗎? –

回答

2

下面是一些讓你開始使用的「空中密碼」。

% The variable we want to process 
myVarName = 'ws_80'; 

for yr=1961:2000 
    inFile = strcat('lffd',num2str(yr),'_V10M_Iberia.nc'); 
    disp(inFile); 
    outFile = strcat('lffd',num2str(yr),'_V10M_Iberia_processed.nc'); 
    disp(outFile); 

    % copy input file to create a template for the output 
    copyDone = copyfile(inFile, outFile,'f'); 
    if(~copyDone) 
     error('Could not copy file'); 
    end 

    % Read variable 
    inVar = ncread(inFile,myVarName); 

    % Replace this line with your equation 
    outVar = myProcessFunction(inVar); 

    % Write variable 
    ncwrite(outFile, myVarName, outVar); 

end 

您將不得不對此進行修改以適應您的目標。嘗試一下,然後回到你卡住的地方。

+0

你的'空氣密碼'完全符合我的所有需求。 非常感謝。我非常感謝你。 – rochinha44