首先看一个nc文件中包含哪些部分,例如一个标准的 FVCOM 输入文件 wind.nc

netcdf wind {
dimensions:
nele = 36858 ;
node = 18718 ;
time = UNLIMITED ; // (151 currently)
variables:
int iint(time) ;
iint:long_name = "internal mode iteration number" ;
float time(time) ;
time:long_name = "time" ;
time:units = "days since 0.0" ;
time:time_zone = "none" ;
float uwind_speed(time, nele) ;
uwind_speed:long_name = "Eastward Wind Speed" ;
uwind_speed:standard_name = "Wind Speed" ;
uwind_speed:units = "m/s" ;
uwind_speed:grid = "fvcom_grid" ;
uwind_speed:type = "data" ;
float vwind_speed(time, nele) ;
vwind_speed:long_name = "Northward Wind Speed" ;
vwind_speed:standard_name = "Wind Speed" ;
vwind_speed:units = "m/s" ;
vwind_speed:grid = "fvcom_grid" ;
vwind_speed:type = "data" ; // global attributes:
:title = "wind.nc" ;
:institution = "School for Marine Science and Technology" ;
:source = "fvcom grid (unstructured) surface forcing" ;
:history = "FILE CREATED: Sun Jul 31 13:48:52 2011" ;
:references = "http://fvcom.smast.umassd.edu,http://codfish.smast.umassd.edu" ;
:Conventions = "CF-1.0" ;
:CoordinateSystem = "Cartesian" ;
:CoordinateProjection = "none" ;
}

nc 文件主要内容

可以看出 nc 文件包含两个主要部分:

  1. dimensions:各个变量维度大小
  2. variables:变量

dimensions

在上面文件中包含三个维度:nelenodetime。其中 nelenode 两个是固定长度的,而 time 则是 UNLIMITED,代表其为任意长度。

variables

variables 下,每个变量形式为

float uwind_speed(time, nele)

括号包含了变量的维度,每个维度变量指定了该变量某个维度的长度。

netcdf 定义中数组是按行排列,因此循环是由右至左。而在matlab中,数组则是按列排列,因此储存的数组会将各个维度顺序交换,即 uwind_speed(nele, time)

生成nc文件方法

使用 matlab 的 netcdf 工具箱生成文件时需要按照以下顺序:

  1. 定义文件内维度与变量,包括
  • 定义维度
  • 定义变量
  1. 储存变量

以生成一个如上的wind.nc文件为例

定义维度

首先定义文件中维度:nelenodetime

注意 time 长度是不固定的。

%% creat new netcdf file

ncid = netcdf.create('wind.nc','CLOBBER');

% definition
ele_dim = netcdf.defDim(ncid,'nele', eleNum);
node_dim = netcdf.defDim(ncid,'node', nodeNum);
time_dim = netcdf.defDim(ncid,'time', netcdf.getConstant('NC_UNLIMITED'));

定义维度之后便可根据维度定义变量。

注意,由于 time 维度是不定长度的,因此其必须作为变量最后一个维度(元素循环由左向右)

iint_var_id = netcdf.defVar(ncid,'init','int', time_dim);
time_var_id = netcdf.defVar(ncid,'time','float', time_dim);
u_var_id = netcdf.defVar(ncid,'uwind_speed','double',[ele_dim, time_dim]);
v_var_id = netcdf.defVar(ncid,'vwind_speed','double',[ele_dim, time_dim]); % end definition
netcdf.endDef(ncid);
netcdf.close(ncid);

定义完变量之后便可向nc文件中储存数据了。

在这里需要注意的是,由于matlab 调用 c 语言的 NetCDF函数库,因此在其函数中数组下标是由0开始。(详见 help netcdf

% write data
ncid = netcdf.open('wind.nc', 'WRITE');
netcdf.putVar(ncid, time_var_id, 0, nstep, 1, time(1:nstep));

如上述代码中,0 为起始序号,nstep 为数据总数, 1 为储存数据间隔,time 即使储存在matlab中变量名。

采用相同方法将 uwind_speedvwind_speed 循环储存在文件内。

for itime = 1:nstep
... netcdf.putVar(ncid, u_var_id, [0, itime-1], [eleNum, 1], u_interp); ...
netcdf.putVar(ncid, v_var_id, [0, itime-1], [eleNum, 1], v_interp); fprintf('Processing: %f \n', itime/nstep);
end% for

在这里,uwind_speedvwind_speed 是多维数组,因此指定其起始位置也要采用一个向量 [0, itime-1]0 代表 nele 维度起始序号;'itime-1' 则代表 time 维度起始序号)。[eleNum, 1] 为这次要储存的数据占个维度个数,明显我们要储存一整个时间步的数据,所以长度分别为单元个数与时间步数 1。最后 u_interpv_interp 则是变量名。

结语

最终,我们来检查下生成的nc文件,使用 matlab 版本为 R2014b,NetCDF 版本号为4.1.3。

Source:
/Users/mac/Documents/MATLAB/temp/forZhangNa/FVCOM_wind/wind.nc
Format:
classic
Dimensions:
nele = 21284
node = 10951
time = 3 (UNLIMITED)
Variables:
init
Size: 3x1
Dimensions: time
Datatype: int32
time
Size: 3x1
Dimensions: time
Datatype: single
uwind_speed
Size: 21284x3
Dimensions: nele,time
Datatype: double
vwind_speed
Size: 21284x3
Dimensions: nele,time
Datatype: double

制作nc文件(Matlab)的更多相关文章

  1. 3种方法快速制作tpk文件 [转]

    tpk是ArcGIS10.1推出的一种新的数据文件类型,主要是用于将切片文件打包形成离线地图包,tpk可以在ArcGIS Runtime或者ArcGIS for Android/iOS中作为切片底图被 ...

  2. NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版

    nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...

  3. Ubuntu下制作ISO文件

    利用Ubuntu自带的命令mkisofs就可以制作iso文件,具体方法如下: 1.   如果你是直接从cd压制iso文件的,执行 sudo umount /dev/cdromdd if=/dev/cd ...

  4. 如何制作CSR文件?

    如何制作CSR文件? 在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单 ...

  5. 用C#制作PDF文件全攻略

    用C#制作PDF文件全攻略 目  录 前    言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...

  6. 制作BibTex文件

    上一篇日志中讲到了在LaTeX中使用BibTex管理参考文献,这篇日志具体总结下如何制作BibTex文件. 制作BibTex文件,主要有以下几种方法: 手工制作: 直接从期刊数据库中下载: 借助Goo ...

  7. 如何制作iso文件

    UltraISO 9.6.2.3059中文完美破解安装版 http://www.upantool.com/qidong/2011/UltraISO_v9.5.0.2800.html 软碟通v9.6.2 ...

  8. 使用和制作patch文件

    使用和制作patch文件 发表时间: 2007-2-13 20:57    作者: superuser    来源: 迷茫人 字体: 小 中 大 | 打印 原文http://www.linuxsir. ...

  9. 实战DeviceIoControl 之三:制作磁盘镜像文件

    Q DOS命令DISKCOPY给我很深的印象,现在也有许多"克隆"软件,可以对磁盘进行全盘复制.我想,要制作磁盘镜像文件,DeviceIoControl应该很有用武之地吧? A 是 ...

随机推荐

  1. 【UE4 C++ 基础知识】<15> 智能指针 TSharedPtr、UniquePtr、TWeakPtr、TSharedRef

    基本概念 UE4 对 UObject 对象提供垃圾回收 UE4 对原生对象不提供垃圾回收,需要手动进行清理 方式 malloc / free new / delete new与malloc的区别在于, ...

  2. Vue CLI 5 和 vite 创建 vue3.x 项目以及 Vue CLI 和 vite 的区别

    这几天进入 Vue CLI 官网,发现不能选择 Vue CLI 的版本,也就是说查不到 vue-cli 4 以下版本的文档. 如果此时电脑上安装了 Vue CLI,那么旧版安装的 vue 项目很可能会 ...

  3. 如何配置log4Net

    之前曾经用过几次,但是每次都是用完就忘了,下次再用的时候要baidu半天,这次弄通之后直接记下来. 步骤如下. 1. 安装log4Net,直接用NuGet, Install-Package log4N ...

  4. 并发编程从零开始(六)-BlockingDeque+CopyOnWrite

    并发编程从零开始(六)-BlockingDeque+CopyOnWrite 5.2 BlockingDeque BlockingDeque定义了一个阻塞的双端队列接口: 该接口继承了BlockingQ ...

  5. 极简实用的Asp.NetCore框架再新增商城模块

    概述 关于这个框架的背景,在前面我已经交代过了.不清楚的可以查看这个链接 1.极简实用的Asp.NetCore模块化框架决定免费开源了 2.极简实用的Asp.NetCore模块化框架新增CMS模块 算 ...

  6. STM32 PWM功能在关闭时GPIO电平不确定的情况

    刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况.在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确 ...

  7. IM服务器:我的千万级在线聊天服务器集群

    一.服务器特点 01.傻瓜式部署,一键式启动: 02.单机支持10万以上在线用户聊天(8G内存,如果内存足够大,并发量可超过10万): 03.支持服务器集群,集群间高内聚.低耦合,可动态横向扩展IM服 ...

  8. Xtrabackup 全量备份脚本

    #!/bin/bash #备份文件的名字为当前主机的IP地址+tar.gz,例如172.16.103.1.tar.gz,且每次备份成功之后都会清空本地的备份目录. #相关目录 mkdir -p /xt ...

  9. centos7 二进制安装mysql-8.0.19

    安装包下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz 1.检 ...

  10. fork函数详解(附代码)

    虽然篇幅很长,但大多是易懂的代码,不用担心看不完 这里的所有操作,都将在下面的代码中有所体现 fork会拷贝当前进程的内存,并创建一个新的进程.如上图,fork函数会将整个进程的内存镜像拷贝到新的内存 ...