爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14008|回复: 12

[程序设计] 用MATLAB读取和编写nc文件

[复制链接]

新浪微博达人勋

发表于 2020-2-11 20:59:31 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
clear all;close all;clc;
%% 创建nc文件
ncid = netcdf.create('D:\BOB\marine\uv_cmems_lev1.nc','CLOBBER');    %创建一个存放数据的nc文件

%% 定义维度参数
    % dimid = netcdf.defDim(ncid,dimname,dimlen)   
    dimidx = netcdf.defDim(ncid,'lon',121);
    dimidy = netcdf.defDim(ncid,'lat',109);
    dimidz = netcdf.defDim(ncid,'time',2048);
   
%% 定义新的变量
     varid = netcdf.defVar(ncid,'uvel','double',[dimidx dimidy dimidz]);
    varid2 = netcdf.defVar(ncid,'vvel','double',[dimidx dimidy dimidz]);%%不知道为什么之前写为nc_short怎么也没有办赋值,很难受
    % varid = netcdf.defVar(ncid,varname,xtype,dimids)
    varid3 = netcdf.defVar(ncid,'lon','NC_FLOAT',[dimidx]);
    varid4 = netcdf.defVar(ncid,'lat','NC_FLOAT',[dimidy]);
    varid5 = netcdf.defVar(ncid,'time','double',[dimidz]);
   
%% 新变量的属性
     netcdf.putAtt(ncid,varid,'units','m s-1');                                                     
     netcdf.putAtt(ncid,varid,'long_name','Eastward velocity');
     netcdf.putAtt(ncid,varid2,'units','m s-1');
     netcdf.putAtt(ncid,varid2,'long_name','Northward velocity');
    netcdf.putAtt(ncid,varid3,'units','degress_east');
    netcdf.putAtt(ncid,varid3,'long_name','Longitude');
    netcdf.putAtt(ncid,varid3,'valid_min','= 80');
    netcdf.putAtt(ncid,varid3,'valid_max','= 90');
    netcdf.putAtt(ncid,varid4,'units','degress_north');
    netcdf.putAtt(ncid,varid4,'long_name','Latitude');
    netcdf.putAtt(ncid,varid4,'valid_min','= 4');
    netcdf.putAtt(ncid,varid4,'valid_max','= 13');
    netcdf.putAtt(ncid,varid4,'step','= 0.083336');
    netcdf.putAtt(ncid,varid5,'units','hours since 1950-01-01 00:00:00');
    netcdf.endDef(ncid);
   
%% 给新变量赋值
%读取数据
    file1='D:/BOB/data/uv/u0/u0_cmems_lev1.nc';
    file2='D:/BOB/data/uv/v0/v0_cmems_lev1.nc';
    u0=ncread(file1,'uo');
    v0=ncread(file2,'vo');
    lon0=ncread(file1,'longitude');
    lat0=ncread(file1,'latitude');
    t=ncread(file1,'time');
    u0=squeeze(u0);v0=squeeze(v0);
    u1=u0(:,:,1:2048);v1=v0(:,:,1:2048);
    t1=t(1:2048,1);
   
%赋值
    netcdf.putVar(ncid,varid,u1);
    netcdf.putVar(ncid,varid2,v1);
    netcdf.putVar(ncid,varid3,lon0);
    netcdf.putVar(ncid,varid4,lat0);
    netcdf.putVar(ncid,varid5,t1);
    netcdf.close(ncid);
   
%% 检查新的nc文件
file3='D:\BOB\marine\uv_cmems_lev1.nc';
% ncdisp(file3);
u3=ncread(file3,'uvel');
u31=squeeze(u3(1,1,:));
v3=ncread(file3,'vvel');
v31=squeeze(v3(1,1,:));
lon1=ncread(file3,'lon');
lat1=ncread(file3,'lat');
u_t=ncread(file3,'time');
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-2-13 17:17:06 | 显示全部楼层
忘了,给数据去除异常值,无语   

ssh(ssh==6.103701889514923e-04)=nan;
ssh(ssh==-6.103701889514923e-04)=nan;
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-2-14 15:09:13 | 显示全部楼层
谢谢楼主!嘻嘻
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-2-18 14:22:23 | 显示全部楼层

这个好
matlab处理nc格式数据简单易学
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-3-1 00:08:48 | 显示全部楼层
楼主你好,请问如果一个四维数组(经度,纬度,时间,高度),对时间维循环写入数据,但是每个时间维对应的高度维数据已知,该怎么写入呀~
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-6 11:47:27 | 显示全部楼层
lliwanling 发表于 2020-3-1 00:08
楼主你好,请问如果一个四维数组(经度,纬度,时间,高度),对时间维循环写入数据,但是每个时间维对应的 ...

你用ncdisp读取原数据每个变量的特征,具体的高度你可以作为ssh或者其他变量的属性写进去就好了吧,我也是个瓜皮,不知道建议是否有用了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-3-11 10:34:17 | 显示全部楼层
楼主您好,我有一个500M的nc文件,我把数据读入Matlab,再编写nc文件把数据保存出来,结果新的nc文件变成了2G,xtype也没有改,不知是哪里有问题,请问您有遇到过这种情况吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-11 13:47:09 | 显示全部楼层
海那边的大脸猫 发表于 2020-3-11 10:34
楼主您好,我有一个500M的nc文件,我把数据读入Matlab,再编写nc文件把数据保存出来,结果新的nc文件变成了 ...

没有哎,你是按照我的程序写的吗?要不你程序贴出来看一下?菜鸟互相讨论一下,哈哈哈哈哈
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-23 21:40:16 | 显示全部楼层
是兜兜啊 发表于 2020-3-11 13:47
没有哎,你是按照我的程序写的吗?要不你程序贴出来看一下?菜鸟互相讨论一下,哈哈哈哈哈

哈哈,谢谢你啊,我后来发现程序没有问题,我发现还是数据取的范围大了,把范围缩小后,就变为几百兆了。没想到就扩大了一点范围,所占的内存大了这么多
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-9 16:14:29 | 显示全部楼层
本帖最后由 肖申克的梦 于 2020-7-16 11:14 编辑

楼主你好请问如果变量time的数据是字符串的话该怎么设置维度?
捕获.PNG
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表