Main Content

matlab.io.hdf4.sd.setNBitDataSet

パッケージ: matlab.io.hdf4.sd

データセット値の非標準ビット長の指定

構文

setNBitDataSet(sdsID,startBit,bitlen,ext,fillone)

説明

setNBitDataSet(sdsID,startBit,bitlen,ext,fillone) は、sdsID で指定された整数データセットに、startBitbitlen で指定された非標準長のデータを含めるよう指定します。

1 ビットから 32 ビットまでであれば、どの長さでも指定できます。データセット配列に対して setNBitDataset を呼び出すと、読み取り/書き込み操作の度にデータセット配列の新しいデータ長と読み取り/書き込みバッファーのデータ長との間で、変換が行われるようになります。

すべてのデータ型のビット長は、0 で始まるビット フィールドの右からカウントされます。01111011 の値を含むビット フィールドでは、ビット 2 と 7 が 0 に設定され、それ以外のビットはすべて 1 に設定されます。最下位ビットはビット 0 です。

startBit パラメーターは、書き込まれる可変長ビット フィールドの左端の位置を指定します。たとえば、前の段落で説明されたビット フィールドでは、4 に設定された startBit パラメーターは、右から 4 つ目のビット値 1 に対応します。

bitlen パラメーターは、書き込まれる可変長ビット フィールドのビット数を指定します。この数字には開始ビットが含まれており、カウントは、ビット フィールドの右端、すなわち、下位ビットの数字に向かって進みます。たとえば、ビット 5 から始めて、前の段落で説明されているビットフィールドの 4 つのビットを書き込むと、データセットにビット フィールド 1110 が書き込まれます。これは、startBit 値の 5 と、bitlen 値の 4 に対応します。

パラメーター ext は、可変長ビット フィールドの左端のビットを使用して、データセットのデータの左端ビットまで符号拡張するかどうかを指定します。たとえば、9 ビットの符号付き整数データがビット 17 ~ 25 から抽出され、位置 25 のビットが 1である場合、データがディスクから再度読み取られたときに、ビット 26 ~ 31 は 1 に設定されます。それ以外の場合、ビット 25 は 0 になり、ビット 26 ~ 31 は 0 に設定されます。ext パラメーターは true (すなわち 1) または false (すなわち 0) に設定できます。符号拡張するには、true を指定します。

パラメーター fillone は、「背景」ビットに値 1 と 0 のどちらを埋め込むかを指定します。このパラメーターも、true (すなわち 1) または false (すなわち 0) に設定されます。

非標準長のデータセットの「背景」ビットは、ディスクに格納されている非標準長のビット フィールドの外にあるビットです。たとえば、ビット 5 ~ 9に配置されている符号なしの 16 ビット整数データセットの 5 つのビットが、パラメーター fillonetrue (すなわち 1) に設定されているディスクに書き込まれる場合、データがメモリに再読み込みされると、ビット 0 ~ 4 と 10 ~ 15 は 1 に設定されます。同じ 5 ビットのデータが、fillone 値を false (すなわち 0) に設定した状態で書き込まれる場合、ビット 0 ~ 4 と 10 ~ 15 は 0 に設定されます。

fillone の操作は ext に操作の前に実行されます。たとえば、上記の ext の例を使用すると、まずビット 0 ~ 16 と 26 ~ 31 が背景ビット値に設定され、続いて、ビット 26 ~ 31 が 25 番目のビットの値に基づいて、1 または 0 に設定されます。

この関数は、HDF ライブラリ C API の関数 SDsetnbitdataset に相当します。

import matlab.io.hdf4.*
sdID = sd.start('myfile.hdf','create');
sdsID = sd.create(sdID,'temperature','int32',[10 20]);
sd.setNBitDataSet(sdsID,6,4,0,0);
data = int32([1:200]);
data = reshape(data,10,20);
sd.writeData(sdsID,[0 0],data);
sd.endAccess(sdsID);
sd.close(sdID);