NetCDF ファイルへのエクスポート
高水準関数と netcdf 名前空間の低水準関数を使用して、netCDF ファイルの作成、マージ、および書き込みを行います。
MATLAB NetCDF 機能
Network Common Data Form (netCDF) は一連のソフトウェア ライブラリとハードウェア非依存型のデータ形式であり、配列指向の科学データの作成、アクセスおよび共有をサポートしています。NetCDF は、データ共有を目的とする標準のデータ保存方法が必要な工学および科学の諸分野で幅広く使用されています。
MATLAB® 高水準関数を使用すると、データを NetCDF ファイルに簡単にエクスポートできます。MATLAB 低水準関数は、NetCDF C ライブラリのルーチンへのアクセスを提供します。低水準関数を効果的に使用するには、netCDF C インターフェイスに関する知識が必要です。NetCDF ドキュメンテーションは、Unidata Web サイトで入手できます。
メモ
互換性のない異なる形式の Common Data Format (CDF) ファイルへのエクスポートの詳細は、CDF ファイルへのエクスポートを参照してください。
既存のファイルまたはテンプレートからの新しい NetCDF ファイルの作成
この例では、既存のファイルの変数、次元およびグループの定義を含むが、形式の異なる新しい NetCDF ファイルを作成する方法を説明します。
関数 nccreate を使用して、1 つの変数を含むファイルを作成します。
nccreate('myfile.nc','myvar')
データをファイルに書き込みます。
A = 99; ncwrite('myfile.nc','myvar',A)
ncinfo を使用して、ファイルから変数、次元、およびグループの定義を読み取ります。この情報によってファイルの "スキーマ" が定義されます。
S = ncinfo('myfile.nc');ファイルの形式を取得します。
file_fmt = S.Format
file_fmt = 'netcdf4_classic'
構造体 S の Format フィールドの値を、サポートされる別の NetCDF 形式に変更します。
S.Format = 'netcdf4';関数 ncwriteschema を使用して、新しい形式を使用するファイルの新バージョンを作成します。スキーマによってファイルの構造が定義されますが、元のファイルにあったデータは一切含まれていません。
ncwriteschema('newfile.nc',S) S = ncinfo('newfile.nc');
メモ: ncwriteschema を使用してファイルの形式を変換する際、新しい形式でサポートされていないフィールドが変換元のファイル形式に含まれている場合は、警告メッセージが表示されることがあります。たとえば、netcdf4 では埋め込み値がサポートされますが、従来の NetCDF 形式ではサポートされません。こうした場合でも ncwriteschema によりファイルは作成されますが、新しい形式で定義できないフィールドは除外されます。
新しいファイルの形式を表示します。
new_fmt = S.Format
new_fmt = 'netcdf4'
新しいファイル newfile.nc には myfile.nc の変数と次元の定義が含まれますが、データは含まれません。
データを新しいファイルに書き込みます。
ncwrite('newfile.nc','myvar',A)
2 つの NetCDF ファイルの結合
この例では、高水準関数を使用して 2 つの netCDF ファイルを結合する方法を説明します。結合したファイルには結合元のファイルの変数と次元の定義が含まれますが、元のファイルのデータは含まれていません。
ex1.nc という名前の netCDF ファイルを作成し、myvar という名前の変数を定義します。次に、データを変数に書き込み、ファイルの内容を表示します。
nccreate('ex1.nc','myvar'); ncwrite('ex1.nc','myvar',55) ncdisp('ex1.nc')
Source:
pwd\ex1.nc
Format:
netcdf4_classic
Variables:
myvar
Size: 1x1
Dimensions:
Datatype: double2 つ目のファイルを作成し、myvar2 という名前の変数を定義します。次に、データを変数に書き込み、ファイルの内容を表示します。
nccreate('ex2.nc','myvar2'); ncwrite('ex2.nc','myvar2',99) ncdisp('ex2.nc')
Source:
pwd\ex2.nc
Format:
netcdf4_classic
Variables:
myvar2
Size: 1x1
Dimensions:
Datatype: double関数 ncinfo を使用して、各ファイルのスキーマを取得します。
info1 = ncinfo('ex1.nc')info1 =
Filename: 'pwd\ex1.nc'
Name: '/'
Dimensions: []
Variables: [1x1 struct]
Attributes: []
Groups: []
Format: 'netcdf4_classic'info2 = ncinfo('ex2.nc')info2 =
Filename: 'pwd\ex2.nc'
Name: '/'
Dimensions: []
Variables: [1x1 struct]
Attributes: []
Groups: []
Format: 'netcdf4_classic'
関数 ncwriteschema を使用して、最初のサンプル ファイルのスキーマを使用する新しい netCDF ファイルを作成します。次に、ファイルの内容を表示します。
ncwriteschema('combined.nc',info1) ncdisp('combined.nc')
Source:
pwd\combined.nc
Format:
netcdf4_classic
Variables:
myvar
Size: 1x1
Dimensions:
Datatype: double
Attributes:
_FillValue = 9.969209968386869e+36ncwriteschema を使用して ex2.nc のスキーマを combined.nc に追加します。
ncwriteschema('combined.nc',info2)結合されたファイルの内容を表示します。
ncdisp('combined.nc')Source:
pwd\combined.nc
Format:
netcdf4_classic
Variables:
myvar
Size: 1x1
Dimensions:
Datatype: double
Attributes:
_FillValue = 9.969209968386869e+36
myvar2
Size: 1x1
Dimensions:
Datatype: double
Attributes:
_FillValue = 9.969209968386869e+36最初のサンプル ファイルで定義された変数 myvar と 2 つ目のファイルで定義された変数 myvar2 がファイルに含まれています。
低水準関数による NetCDF ファイルへのデータの書き込み
この例では、低水準関数を使用して netCDF ファイルにデータを書き込む方法を説明します。MATLAB® の低水準関数によって、netCDF C ライブラリのルーチンにアクセスできます。MATLAB では、netcdf という名前の名前空間に関数がまとめられています。名前空間内のいずれかの関数を呼び出すには、関数名の前に名前空間を指定しなければなりません。
MATLAB netCDF 関数を効果的に使用するには、netCDF C インターフェイスに関する知識が必要です。
この例を実行するには、現在のフォルダーへの書き込み権限が必要です。
MATLAB ワークスペースで、数値から成る 1 行 50 列の my_data という名前の変数を作成します。このベクトルのクラスは double です。
my_data = linspace(0,49,50);
関数 netcdf.create を使用して、my_file.nc という名前の netCDF ファイルを作成します。NOCLOBBER パラメーターは netCDF ファイル アクセス定数であり、これによって同名の既存のファイルを上書きしないよう指示が出されます。
ncid = netcdf.create("my_file.nc","NOCLOBBER");
netcdf.create はファイル識別子 ncid を返します。netCDF ファイルを作成すると、ファイルは定義モードで開きます。次元と変数を定義するには定義モードにしなければなりません。
関数 netcdf.defDim を使用してファイル内の次元を定義します。この関数は、NetCDF ライブラリ C API の関数 nc_def_dim に相当します。変数を定義してファイルにデータを書き込むには、まずファイル内の次元を定義しなければなりません。この例では、長さが 50 の my_dim という名前の次元を定義します。
dimid = netcdf.defDim(ncid,"my_dim",50);netcdf.defDim は、新しい次元に対応する次元識別子を返します。識別子は 0 ベースのインデックスです。
関数 netcdf.defVar を使用して、その次元における my_var という名前の変数を定義します。この関数は、netCDF ライブラリ C API の関数 nc_def_var に相当します。この変数の netCDF データ型、この例では NC_BYTE を指定します。
varid = netcdf.defVar(ncid,"my_var","NC_BYTE",dimid);
netcdf.defVar は、my_var に対応する変数識別子を返します。
netCDF ファイルの定義モードを終了します。ファイルにデータを書き込むには、データ モードにしなければなりません。
netcdf.endDef(ncid)
関数 netcdf.putVar を使用して、MATLAB ワークスペースのデータを netCDF ファイルの変数に書き込みます。ワークスペースのデータはクラス double ですが、netCDF ファイルの変数は NC_BYTE 型です。MATLAB netCDF 関数によって自動的に変換が行われます。
netcdf.putVar(ncid,varid,my_data)
関数 netcdf.close を使用してファイルを閉じます。
netcdf.close(ncid)
ファイルを開き、変数のデータを MATLAB ワークスペースの新しい変数に読み取って、データがファイルに書き込まれたことを確認します。
ncid2 = netcdf.open("my_file.nc","NC_NOWRITE"); x = netcdf.getVar(ncid2,0);
x のデータ型を表示します。
whos xName Size Bytes Class Attributes x 50x1 50 int8
データは、MATLAB では列優先の順序で格納されますが、netCDF C API では行優先の順序が使用されています。x は netCDF ファイルに格納されたデータを表すため、MATLAB ワークスペース内の元のベクトル my_data が 1 行 50 列であっても、50 行 1 列となります。データは NC_BYTE として NetCDF ファイルに保存されているため、MATLAB は変数のデータをクラス int8 としてワークスペースに読み取ります。
ファイルを閉じます。
netcdf.close(ncid2)