多次元配列と可変長配列

2005 年に、それまでは Binary Table の付録となっていた “多次元配列” と “可変長配列” の規約が正式にスタンダードに取り入れられた。

FITS のバイナリテーブルにおいて最も特徴的なのは、1つの列に複数のセルを持たせる事ができることで、TFORMnの値において rが 2以上の場合を固定長配列という。 例えば TFORM99 = '48I' と定義すると、1つの列に 16-bit 整数が 48個入ることになる。 この様子はテーブルを単純な列の連なりと捉えるとわかりづらいが、テーブルに奥行があって、48個のセルが奥に向かってずらりと並んでいると考えると理解しやすいかもしれない。

多次元配列を定義するには、オプションキーワード TDIMnを使う。 TDIMnは、列 $ n$ の多次元配列の定義を与えるもので、TFORMnr とは異なり、列のバイト長に影響を与えるものではなく、データの解釈として利用される。r が 2以上の場合に指定でき、$ (l, m)$の形を取る。 上記の例でさらに TDIM99 = '(8,6)'と定義すれば、48個のセルを $ 8 \times 6$の 2次元配列と解釈することになっており、これを多次元配列という。

データ型の定義で最もわかりづらいのが、いわゆる“可変長配列”と呼ばれる TFORMnrPtまたは rQtの場合である。 この場合、セルが奥に向かってずらりと並んでおり、その個数は固定ではないと考えれば良いが、データの格納方法が極めて特殊である。 可変長配列の場合は、配列データの実体はヒープ領域のどこかに格納され、テーブル本体(Data Unit のデータ配列)のセルにはその行における“配列長”と“ヒープ領域中の位置(オフセット)”が格納されている。 例えば、TFORM6 = '1PE(3353)' という定義があった場合、配列の個数の最大が 3353 であり、ヒープ領域のどこかに 32-bit 浮動小数点数(シンボルは“E”)を格納しているという意味になる。 この場合、テーブル本体の当該列のある行に、$ (12,34)$ という数値(配列記述子)が格納されているとすると、ヒープ領域の先頭から 34バイトのオフセットの位置から 12個の 32-bit 浮動小数点数が格納されていることになる。

詳細については前述の原論文、または FITS Standard 4.0 の 7.3節を参照されたい。



Osamu Kanamitsu
2019-02-15