Development Environment | ![]() ![]() |
HDFフォーマットでデータのエクスポート
MATLABからHDFファイルにデータをエクスポートするには、HDFデータタイプに関連付けられたHDF APIを使用する必要があります。各々のAPI は、固有のプログラミングモデル、すなわち、ルーチンを使って、HDF ファイルをオープンし、ファイルの中のデータにアクセスし、データセット(HDFファイルの中に保存されている数値配列をデータセットと呼びます)からデータを読むことを前もって設定しています。
この概念を示すために、この節では、一つの特別な HDF API、すなわち、Scientific Data(SD) のプログラミングモデルの詳細を示します。他のHDF API の取り扱いに関する情報は、オフィシャルなNCSA ドキュメントを参照してください。
HDF SD エクスポートプログラミングモデル
HDF SDデータをエクスポートするプログラミングモデルは、つぎの操作を実行します。
ユーザは、HDFファイルに自身のデータを説明する情報を埋め込むことができます。この点の詳細については、メタデータをHDFファイルに埋め込むを参考にしてください。
HDFファイルの作成
MATLABデータをHDFフォーマットでエクスポートするには、先ず、HDFファイルを作成するか、既存のHDFファイルをオープンする必要があります。これらの操作を行うには、関数SDstart
を使用してください。
たとえば、つぎのコードは、mydata.hdf
と名付けられたHDFファイルを作成します。
sd_id = hdfsd('start','mydata.hdf','DFACC_CREATE');
ファイルを作成、または、オープンすることができれば、SDstart
は、SDファイルの識別子(この例では、sd_id
)を出力します。作成、または、開くことができなければ、-1
を出力します。
DFRACC_CREATE
アクセスモードを指定すると、関数SDstart
は、ファイルを作成し、HDF SDマルチファイルインタフェースを初期化します。DFACC_CREATE
モードを指定し、ファイルが既に存在している場合、関数SDstart
は実行できずに、-1
を出力します。既存のHDFファイルを開くには、HDF read、または、writeモードに設定する必要があります。これらのモードで、関数SDstart
をどのように使用するかについては、HDFファイルのオープンを参照してください。
HDFデータセットの作成
HDF ファイルを作成、または、既存のHDFファイルをオープンした後、エクスポートしたい各MATLAB配列に対して、HDFファイルで、データセットを作成する必要があります。関数SDcreate
を使って、データセットを作成することができます(既存のデータセットをHDFファイルに書き出すには、関数SDselect
を使用してください。詳細は、HDF ファイル内のデータセットの選択を参照してください)。
SDstart
から出力された適切なSDファイル識別子(sd_id
)これらの引数に割り当てる値は、エクスポートしたいMATLAB配列によって決まります。たとえば、つぎの3行5列のMATLAB倍数配列をエクスポートするには、
A = [ 1 2 3 4 5 ; 6 7 8 9 10 ; 11 12 13 14 15 ];
ds_name = 'A'; ds_type = 'double'; ds_rank = ndims(A); ds_dims = fliplr(size(A)); sds_id = hdfsd('create',sd_id,ds_name,ds_type,ds_rank,ds_dims);
関数SDcreate
が、うまくデータセットを作成できれば、SDデータセット識別子(sds_id
)を出力します。失敗すれば、SDcreate
は、 -1
を出力します。
一度データセットを作成すると、その特性を変更することはできません。しかし、データセットを構成するデータを修正することは可能です。データを修正するには、データセットへのアクセスを初期化し、SDselect
を使用し、MATLABデータをHDFファイルに書き出すで説明している方法で、データセットの書き出し処理を行います。
MATLABデータをHDFファイルに書き出す
HDFファイルを作成し、ファイル内にデータセットを作成した後、SDwritedata
関数を使って、データセットにデータを書き込むことが可能となります。関数 SDwritedata
を使えば、データセット全体、または、データセットの一部分にデータを書き込むことが可能となります。
SDcreate
、または、SDselect
によって出力された正しいSDデータセット識別子(sds_id
)これらの引数に割り当てる値は、エクスポートしたいMATLAB配列によって決まります。たとえば、つぎのコードの一部は、MATLABの3行5列の倍数の配列
A = [ 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15 ];
ds_start = zeros(1:ndims(A)); % Start at the beginning ds_stride = []; % Write every element. ds_edges = fliplr(size(A)); % Reverse the dimensions. stat = hdfsd('writedata',sds_id, ds_start, ds_stride, ds_edges, A)
データをデータセットに書き出すことができれば、関数SDwritedata
は、0を出力します。そうでなければ、-1
を出力します。
注意 start, stride, edges 引数の値は、MATLABで用いられる、列を優先する順位でなく、行を優先する順位でなければなりません。edges引数の値として割り当てられる前に、関数size で出力されるベクトルの次元の順番を逆にする関数fliplr の使い方を注目してください。
|
データをデータセットの一部に書き出す
データセットの一部分を書き出すには、start、stride、edgesの各ベクトルの値を使って、書き出したいスタート位置と書き出したいデータ数に合わせて設定してください。
つぎの例題は、サンプルデータセットの2番目の行のすべての要素を、SDwritedata
を使って、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
B = [ 9 9 9 9 9]
例題では、startベクトルは、2行目の最初の列に書き込み操作を始めたい点をベクトルで示しています。 HDFは、ゼロベースのインデックス値をどのように使用し、列の次元を最初に指定するかに着目してください。MATLABでは、この位置を(2,1)とします。edges引数には、書き出すデータの次元を指定します。書き出されるデータ配列のサイズとedgeで指定した値は必ず一致しなくてはなりません。
ds_start = [0 1] % Start writing at the first column, second row. ds_stride = []; % Write every element. ds_edges = [5 1]; % Each row is a 1-by-5 vector. stat = hdfsd('writedata',sds_id,ds_start,ds_stride,ds_edges,B);
HDFデータセットとファイルのクローズ
データをHDFファイルの中のデータセットに書き出した後は、SDendaccess
ルーチンを使って、データセットへのアクセスをクローズする必要があります。SDendaccess
への引数は、正しい SD データセット識別子を設定するものです。この例題は、sds_id
です。
stat = hdfsd('endaccess',sds_id);
データセットを閉じた後に、関数SDend
を使って、HDFファイルもクローズする必要があります。SDend
への唯一の引数として、正しい SD ファイル識別子(ここでは、sd_id
)を設定します。
stat = hdfsd('end',sd_id);
SDファイルとデータセット識別子を任意の順にクローズすることができます。しかし、データセットを含むHDFファイルをクローズする前に、データセットへのアクセスを停止する必要があります。
注意 ユーザの全データをHDFファイルに書き出していることを確認するには、開いているHDFの識別子を全てクローズする必要があります。関数SDwritedata を使って行われる書き出し操作は、ファイルをクローズするときに実行されます。便利なことに、MATLAB HDF ユーティリティAPI(ML)が 提供する関数MLcloseall を使えば、一回の命令で開いているデータセット及びファイル識別子を全てクローズすることができます。詳細は、MATLAB HDF ユーティリティAPIの使用を参照してください。
|
![]() | HDFファイルからデータのインポート | メタデータをHDFファイルに埋め込む | ![]() |