| Development Environment | ![]() |
HDFデータのMATLABワークスペースへのインポート
HDFデータを、MATLABにインポートするには、固有のHDF データタイプに関連した HDF API でルーチンを使用する必要があります。各々のAPI は、固有のプログラミングモデル、すなわち、ルーチンを使って、HDF ファイルをオープンし、ファイルの中のデータにアクセスし、データセット(HDFファイルの中に保存されている数値配列をデータセットと呼びます)からデータを読むことを前もって設定しています。
この概念を示すために、この節では、一つの特別な HDF API、すなわち、Scientific Data(SD) のプログラミングモデルの詳細を示します。他のHDF API の取り扱いに関する情報は、オフィシャルなNCSA ドキュメントを参照してください。
HDF SD インポートプログラミングモデル
HDF SD データをインポートするには、APIルーチンを使って、つぎに作業を行なってください。
必要な操作は以上ですが、HDFファイルの内容、または、ファイル内のデータセットに関する情報を抽出するといったいくつかの操作をオプションで行うこともできます。つぎの節で、基本操作とオプション操作の双方について、詳しく解説します。
HDFファイルのオープン
HDFデータをインポートするには、先ず、HDFファイルをオープンする必要があります。SD APIでは、SDstart 関数を使ってファイルをオープンし、HDFインタフェースを初期化します。
たとえば、つぎのコードは、読み出し専用で、ファイルmydata.hdf を開きます。
sd_id = hdfsd('start','mydata.hdf','read');
SDstart が指定したファイルを検出し、オープンできれば、SDファイルの識別子を戻します。この例題では、sd_idになります。オープンできない場合は、-1になります。
HDF ファイルは、いくつかのアクセスモードをサポートしています。HDFインタフェースで定義されたシンボリック定数を使って、各モードを指定します。MATLABでは、これらの定数を文字列で指定できます。省略なしの完全なスペルで入力することもできますが、下の表にリスト表示されている省略形を入力しても構いません。
| HDF ファイル作成モード |
HDF シンボリック定数 |
MATLAB 文字列 |
| 新規ファイルの作成 |
'DFACC_CREATE' |
'create' |
| 読み取り専用 |
'DFACC_RDONLY' |
'read' または、 |
| Read and write access |
'DFACC_RDWR' |
'rdwr' または、'write' |
HDFファイルに関する情報の抽出
HDFファイルを開いた後に、関数SDfileinfoを使って、ファイルの内容に関する情報を得ることができます。この関数は、ファイル内のデータセットの数や、ファイルが何らかのグローバル属性を含んでいるかどうかについて出力します(グローバル属性に関する詳細は、HDFファイルから属性の抽出を参照してください)。
唯一の引数として、SDfileinfo は、SDstartによって戻されるSD識別子sd_idを受け入れます。この例題で、HDFファイルは、3つのデータセットと1つのグローバル属性を含んでいます。
[ndatasets, nglobal_atts, stat] = hdfsd('fileinfo',sd_id)
ndatasets =
3
nglobal_atts =
1
status =
0
HDFファイルから属性の抽出
HDF ファイルは、ファイル内部に自身の情報を記録しておくことができます。すなわち、オプションで、属性と呼ばれるもので、含んでいるデータを記述するものです。HDFファイルに関連した属性は、グローバル属性と呼ばれます(ユーザは、データセット、または、次元と属性を関連付けします。これらの属性に関する詳細は、メタデータをHDFファイルに埋め込むを参照してください)。
HDFファイルからグローバル属性を引き出すには、 SDreadattr 関数を使用します。関数 SDreadattr には、つぎの引数を設定できます。
SDstartによって出力されたSDファイル識別子(sd_id) たとえば、つぎのコードは、最初のグローバル属性の内容(単純なキャラクタ文字列 'my global attribute')を出力します。
attr_idx = 0;
[attr, status] = hdfsd('readattr', sd_id, attr_idx)
attr =
my global attribute
stat =
0
MATLAB は、自動的に出力値attrのサイズを、属性内のデータに適するものに設定します。
名前で属性を抽出する 属性は値と名前をもっています。属性の名前が判明している場合は、関数SDfindattrを使い、インデックス値を定めて属性を抽出することもできます。
関数SDfindattr は、SDオブジェクトに関連した全ての属性を検索します。指定した名前の属性を検知できれば、関数 SDfindattr は、その属性のインデックスを出力します。出力されたインデックス値を使って、関数SDreadattrで属性を抽出することが可能となります。
つぎの例では、my_attと名付けられた属性のインデックスを、関数SDfindattr により取得し、そのインデックスを、関数SDreadattrの引数として、受け渡す処理を行います。
attr_idx = hdfsd('findattr',sd_id,'my_att');
[attr, status] = hdfsd('readattr', sd_id, attr_idx);
HDFファイル内のデータセットの選択
HDFファイルをオープンした後、ファイル内の読みたいデータセットを指定します。1つのHDFファイルが、複数のデータセットから構成されていることもあります。その場合、関数SDselect で、データセットを選択してください。
SDstartによって出力されたSDファイル識別子(sd_id)たとえば、つぎのコードは、sd_idという識別子をもつHDFファイルの3番目のデータセットを選択しています。関数SDselect が、ファイル内から指定したデータセットを見つけだすと、SDデータセット識別子(例題では、sds_id )が出力されます。データセットが発見できなかった場合、-1が出力されます。
sds_idx = 2; % HDF は、ゼロベースのインデックスを使用
sds_id = hdfsd('select',sd_id,sds_idx)
名前でデータセットを抽出
HDFファイルにデータセットを作る場合、データセットには名前が割り当てられます。参照したいデータセットの名前を知っていれば、インデックス値を知らなくとも、SDnametoindex ルーチンを使って、インデックスを確定することができます。
データセットに関する情報の取得
HDFファイル内のデータセットを選択すると、関数SDgetinfoを使って、データセットに関する情報(配列次元のサイズ、数など)を得ることができます。関数SDreaddataを使って、データセットを読み込む時にこれらの情報が必要となります( 詳細については、HDFファイルからデータを読み込むを参照してください)。
関数SDgetinfo には、1つの引数のみ設定できます。引数として設定できるのは、SDselect (sds_id)によって出力されるデータセット識別子です。関数SDgetinfo は、データセットに関するつぎのアイテムを含む、詳細情報を出力します。
たとえば、つぎのコードは、識別子sds_idをもつデータセットに関する情報を抽出します。
[dsname, dsndims, dsdims, dstype, dsatts, stat] =
hdfsd('getinfo',sds_id)
dsname =
A
dsndims =
2
dsdims =
5 3
dstype =
double
dsatts =
0
stat =
0
データセット属性の抽出
HDFファイル同様、HDF SDデータセットもファイル内部に情報を記録しておくことができます。すなわち、オプションでファイルの中に属性と呼ばれる情報を含めておくことができます。データセットに関連付けられた属性をローカル属性と呼びます(属性をデータセットや次元と関連付けることもできます。これらの属性に関する詳細については、メタデータをHDFファイルに埋め込むを参照してください)。
ローカル属性を抽出するには、SDreadattr 関数を使用します。 SDreadattr関数には、つぎの引数を設定できます。
SDselectによって出力されたSDデータセット識別子(sds_id) つぎのサンプルコードは、識別子sds_idをもつデータセットに関連付けられた最初の属性の内容を出力します。この場合、属性の値は、キャラクタ文字列'my local attribute'となります。MATLAB は、自動的に出力値ds_attrのサイズを属性の値に適した大きさに設定します。
attr_idx = 0;
[ds_attr, status] = hdfsd('readattr', sds_id, attr_idx)
ds_attr =
my local attribute
stat =
0
HDFファイルからデータを読み込む
HDFファイルをオープンし、ファイル内のデータセットを選択すると、データセット全体、または、その一部を、関数SDreaddata を使って、読むことができるようになります。
SDselect によって、出力されたSDデータセット識別子(sds_id) start ベクトルと呼びます。 strideベクトルと呼びます。 edges ベクトルと呼びます。つぎのサンプルコードは、関数SDreaddataを使って、3 行5 列の数値行列からなるデータセットの全内容を読み込む操作を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
この例では、サンプルコードが、関数SDreaddataに対する引数の値を指定する上で、関数SDgetinfo の出力値を、どのように指定しているかに着目してください。
[ds_name, ds_ndims, ds_dims, ds_type, ds_atts, stat] =
hdfsd('getinfo',sds_id);
ds_start = zeros(1,ds_ndims); % Creates the vector [0 0]
ds_stride = [];
ds_edges = ds_dims;
[ds_data, status] =
hdfsd('readdata',sds_id,ds_start,ds_stride,ds_edges)
;
disp(ds_data)
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
ds_start)の各要素をゼロに指定しています。また、startベクトルの長さを決める上で、SDgetinfo を、どのように利用しているかについても注意してください。 注意 関数SDgetinfoによって、出力された次元ベクトルdsdimsを利用して、edgesベクトルの値を設定してください。これは、SDgetinfo は、行を優先した順番でこれらの値を出力するからです。MATLABは、列を優先した順番でデータをストアします。MATLABの3行5列配列は、HDFでは5列3行配列とみなされます。
|
データセットの一部分を読み込む
データセットの一部分を読み込むには、start、stride、edgesの各ベクトルの値を、読み始めたい部分、読み込みたいデータ数に合わせて設定してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
を全て読み込む操作を行います。start, stride, edges引数では、列を優先した順番で次元を指定しなければなりません。加えて、これらの引数で用いるインデックス値は、ゼロベースでなくてはなりません。
ds_start = [0 1] % Start reading at the first column, second row
ds_stride = []; % Read each element
ds_edges = [5 1]; % Read a 1-by-5 vector of data
[ds_data, status] =
hdfsd('readdata',sds_id,ds_start,ds_stride,ds_edges)
;
disp(ds_data)
6 7 8 9 10
データセットの範囲をどのように指定するかに関する詳細情報は、MATLABデータをHDFファイルに書き出すを参照してください。
HDFファイル、HDFデータセットのクローズ
HDFファイルのデータセットからデータを読み込んだら、データセットとHDFファイルへのアクセスを終了しなくてはなりません。HDF SD APIには、HDFファイル、HDFデータセットをクローズする機能も用意しています。詳細については、HDFデータセットとファイルのクローズを参照してください。
| MATLAB HDF 関数呼び出し方法 | HDFフォーマットでデータのエクスポート | ![]() |