论文部分内容阅读
[摘 要]HDF是一种广泛用于科学数据共享的国际标准数据格式,正确高效地读取HDF文件数据是对其进行应用的基础。本文首先介绍了HDF文件格式,在此基础上,详细给出了Matlab读取HDF文件的简易方法和代码。
[关键词]HDF格式;Matlab;科学数据
中图分类号:TP319 文献标识码:A 文章编号:1009-914X(2014)47-0312-01
1 引言
科学研究需要对大量的数据进行处理,而这些科学数据有着很多不同的存储形式和标准格式。HDF是美国国家高级计算机应用中心(NCSA)为了满足各种领域研究需要而开发出的一种能高效存储和分发科学数据的新型数据格式。HDF的数据格式是一种分层式数据管理结构,是一个能够自我描述、多目标、用于科学数据存储和分发的数据格式。HDF格式文件被广泛运用于科学数据共享,是目前国际上数据共享应用较广泛的文件格式。正确高效地读取HDF文件里面的数据,是共享HDF格式科学数据的前提。目前比较常用的读取HDF文件的方式是使用IDL、C和Fortran等传统语言工具和GrADS等绘图软件。但是这些读取方式对于非专业人员来说都有一定的难度,不容易在短期内快速掌握,而利用Matlab读取HDF格式数据则相对简单高效。
2 HDF文件介绍
HDF是由伊利诺斯州大学的美国国家超级计算应用中心(NCSA)于1987年开发的一套文件格式,并包括对HDF文件进行操作的函数库。简单说来,HDF是容许共享跨平台的自我描述文件。它的跨平台性,允许人们在不同的操作系统上操作HDF文件而不用对其进行格式转换;它的自我描述性意味着一个数据集,例如一个多维的数字序列,有逻辑上与它联系的额外的元数据,这些元数据用来描述诸如数据集的名称、维数、每维上的元素个数等等。
1993年美国国家航空航天局(NASA)决定把HDF格式作为存储和发布EOS数据的标准格式,于是NASA和NCSA在HDF标准的基础上,开发了一种专门用于存储EOS产品的HDF格式,称之为HDF-EOS。HDF-EOS是HDF的扩展,它主要扩充了两项功能:一是提供了一种系统宽搜索服务方式,它能在没有读文件本身的情况下搜索文件内容;二是提供了有效的存储地理定位数据,将科学数据与地理点捆绑在一起。目前国内由于MODIS接收站的处理系统不同,因此采用这两种格式的都有。但是,这并不妨碍我们用Matlab对其进行处理,因为Matlab对这两种数据格式都能很好地支持。
3 Matlab读取HDF文件的方法
Matlab提供了三种从HDF或者HDF-EOS数据集中读取数据的方法:HDF输入工具、Matlab高级输入函数以及Matlab命令行用法(低级函数用法)。下面分别介绍这三种方法。
①HDF输入工具法,语法为hdftool
HDFImportTool是一个可视化的HDF文件输入工具。此工具可以同时打开多个HDF或HDF-EOS文件。打开文件,选定一个要打开的数据集(DataSet),再选择好相应的参数后,点击Import,即可把选择的数据输入Matlab工作区。因为是可视化的工具,所以该方法简单直观,操作简便易行。
②使用Matlab高级输入函数hdfread
hdfread这个函数隐藏了HDF库中规定的低级函数所必须的许多操作细节。例如,如果使用低级函数从HDF文件中读取数据,需要打开HDF文件,选取数据集,读取数据集中的数据,最后关闭文件这样一系列的操作过程,但是hdfread函數已经把这些所有的过程都包括在内了。因此使用起来相对简单一些。hdfread函数的常用法是:
data=hdfread(filename,dataset);
其中data返回指定数据集中的所有数据,dataset的名称可以由hdfinfo函数获得。
③使用Matlab命令行接口
Matlab用一个单独的低级函数来代替HDF库函数中的一系列应用程序接口(API)的子程序,只要给这个函数的第一个参数指定不同的值,就能相应的使用相当于HDFAPI中不同子程序的功能。这些低级函数的使用需要指定的过程。
下面就以hdfsd这个函数的使用来详细说明。
根据前面所述的流程,首先必须打开HDF文件,函数的语法为:
sd_id=hdfsd(‘start’,‘mydata.hdf’,‘read’);
上式中sd_id返回一个正值表示文件打开成功;返回-1则表示打开文件不成功。在下面的用法中sd_id将用来表示mydata.hdf这个文件。read表示读文件。
其次,要选择数据集,用
sds_id=hdfsd(‘select’,sd_id,sds_idx);
sds_id将在下面的用法中代表所打开的数的数据集,它是要打开的数据集在HDF文件中的索引号。然后是最重要的一步,从数据集中读文件,语法为:
[data,status]=hdfsd(‘readdata’,sds_id,ds_start,de_stride,ds_edges);
ds_start指定从第几个数据开始读取;ds_stride表示读数据的步长;ds_edges表示数组中每一维的长度。
最后是关闭数据集和HDF文件,语法分别为:
stat=hdfsd(‘endaccess’,sds_id);
stat=hdfsd(‘end’,sd_id);
从上面的hdfsd函数的用法中可以看出,虽然只有一个函数,但是由于给函数的第一个参数指定了不同的值,所以它能表示各种不同的用法。
4 结语
从上述说明可以看出,利用Matlab实现HDF文件数据的读取极为简单和高效。这一读取方法非常适用于程序基础不高或非专业的人员使用,同时对HDF文件的操作直观,也可以节省大量读取HDF文件的时间,不必把时间花在库函数的配置上。
参考文献
[1] 景毅刚,李登科,张树誉.HDF-EOS数据格式及其数据导入[J].气象科技,2005,33(3):278-288.
[2] 方庆文,潘永地,郑峰等.利用GrADS读取NCEP再分析资料格点数据[J]. 贵州气象,2004,5(28):34-36.
[3] http://www.nasa.gov/.
[关键词]HDF格式;Matlab;科学数据
中图分类号:TP319 文献标识码:A 文章编号:1009-914X(2014)47-0312-01
1 引言
科学研究需要对大量的数据进行处理,而这些科学数据有着很多不同的存储形式和标准格式。HDF是美国国家高级计算机应用中心(NCSA)为了满足各种领域研究需要而开发出的一种能高效存储和分发科学数据的新型数据格式。HDF的数据格式是一种分层式数据管理结构,是一个能够自我描述、多目标、用于科学数据存储和分发的数据格式。HDF格式文件被广泛运用于科学数据共享,是目前国际上数据共享应用较广泛的文件格式。正确高效地读取HDF文件里面的数据,是共享HDF格式科学数据的前提。目前比较常用的读取HDF文件的方式是使用IDL、C和Fortran等传统语言工具和GrADS等绘图软件。但是这些读取方式对于非专业人员来说都有一定的难度,不容易在短期内快速掌握,而利用Matlab读取HDF格式数据则相对简单高效。
2 HDF文件介绍
HDF是由伊利诺斯州大学的美国国家超级计算应用中心(NCSA)于1987年开发的一套文件格式,并包括对HDF文件进行操作的函数库。简单说来,HDF是容许共享跨平台的自我描述文件。它的跨平台性,允许人们在不同的操作系统上操作HDF文件而不用对其进行格式转换;它的自我描述性意味着一个数据集,例如一个多维的数字序列,有逻辑上与它联系的额外的元数据,这些元数据用来描述诸如数据集的名称、维数、每维上的元素个数等等。
1993年美国国家航空航天局(NASA)决定把HDF格式作为存储和发布EOS数据的标准格式,于是NASA和NCSA在HDF标准的基础上,开发了一种专门用于存储EOS产品的HDF格式,称之为HDF-EOS。HDF-EOS是HDF的扩展,它主要扩充了两项功能:一是提供了一种系统宽搜索服务方式,它能在没有读文件本身的情况下搜索文件内容;二是提供了有效的存储地理定位数据,将科学数据与地理点捆绑在一起。目前国内由于MODIS接收站的处理系统不同,因此采用这两种格式的都有。但是,这并不妨碍我们用Matlab对其进行处理,因为Matlab对这两种数据格式都能很好地支持。
3 Matlab读取HDF文件的方法
Matlab提供了三种从HDF或者HDF-EOS数据集中读取数据的方法:HDF输入工具、Matlab高级输入函数以及Matlab命令行用法(低级函数用法)。下面分别介绍这三种方法。
①HDF输入工具法,语法为hdftool
HDFImportTool是一个可视化的HDF文件输入工具。此工具可以同时打开多个HDF或HDF-EOS文件。打开文件,选定一个要打开的数据集(DataSet),再选择好相应的参数后,点击Import,即可把选择的数据输入Matlab工作区。因为是可视化的工具,所以该方法简单直观,操作简便易行。
②使用Matlab高级输入函数hdfread
hdfread这个函数隐藏了HDF库中规定的低级函数所必须的许多操作细节。例如,如果使用低级函数从HDF文件中读取数据,需要打开HDF文件,选取数据集,读取数据集中的数据,最后关闭文件这样一系列的操作过程,但是hdfread函數已经把这些所有的过程都包括在内了。因此使用起来相对简单一些。hdfread函数的常用法是:
data=hdfread(filename,dataset);
其中data返回指定数据集中的所有数据,dataset的名称可以由hdfinfo函数获得。
③使用Matlab命令行接口
Matlab用一个单独的低级函数来代替HDF库函数中的一系列应用程序接口(API)的子程序,只要给这个函数的第一个参数指定不同的值,就能相应的使用相当于HDFAPI中不同子程序的功能。这些低级函数的使用需要指定的过程。
下面就以hdfsd这个函数的使用来详细说明。
根据前面所述的流程,首先必须打开HDF文件,函数的语法为:
sd_id=hdfsd(‘start’,‘mydata.hdf’,‘read’);
上式中sd_id返回一个正值表示文件打开成功;返回-1则表示打开文件不成功。在下面的用法中sd_id将用来表示mydata.hdf这个文件。read表示读文件。
其次,要选择数据集,用
sds_id=hdfsd(‘select’,sd_id,sds_idx);
sds_id将在下面的用法中代表所打开的数的数据集,它是要打开的数据集在HDF文件中的索引号。然后是最重要的一步,从数据集中读文件,语法为:
[data,status]=hdfsd(‘readdata’,sds_id,ds_start,de_stride,ds_edges);
ds_start指定从第几个数据开始读取;ds_stride表示读数据的步长;ds_edges表示数组中每一维的长度。
最后是关闭数据集和HDF文件,语法分别为:
stat=hdfsd(‘endaccess’,sds_id);
stat=hdfsd(‘end’,sd_id);
从上面的hdfsd函数的用法中可以看出,虽然只有一个函数,但是由于给函数的第一个参数指定了不同的值,所以它能表示各种不同的用法。
4 结语
从上述说明可以看出,利用Matlab实现HDF文件数据的读取极为简单和高效。这一读取方法非常适用于程序基础不高或非专业的人员使用,同时对HDF文件的操作直观,也可以节省大量读取HDF文件的时间,不必把时间花在库函数的配置上。
参考文献
[1] 景毅刚,李登科,张树誉.HDF-EOS数据格式及其数据导入[J].气象科技,2005,33(3):278-288.
[2] 方庆文,潘永地,郑峰等.利用GrADS读取NCEP再分析资料格点数据[J]. 贵州气象,2004,5(28):34-36.
[3] http://www.nasa.gov/.