3.2.3 一般的な部分アクセスに関する追記
マップされた配列断面を使用することによって変数要素のディスクアドレスとメモリ上で格納されているアドレスの間に自明ではない関係を確立することができます。例えば、メモリ上の行列はディスク上の行列を変換したもので、要素が全く異なる順番で格納されるかもしれません。通常の配列断面においてはディスク上とメモリアドレスの関係は自明です:メモリ内での値の構造(次元サイズと順番)は配列断面のものと一致しています。しかしながら、マップされた配列断面においてはNetCDFの変数要素のインデックスとそれらのメモリ上のアドレスとのマッピングを定義するのにインデックスマッピングベクトルが使用されます。
マップされた配列へのアクセスによって、メモリに常駐する配列の原点とある任意の点との間のオフセット量(配列の要素の数)はインデックスマッピングベクトルとその点の座標オフセットベクトル(coordinate offset vector)の内積1(inner product)で表されます。ある任意の点の座標オフセットベクトルは各次元が含んでいる配列の原点からその点までのオフセット量を与えます。C言語ではある点の座標オフセットベクトルは元の座標ベクトルと同一です。
通常の配列部分のインデックスマッピングベクトルは‘最も早く変化する次元から最も遅く変化する次元の順番に’常に定数1を持つはずです。なぜならば、その値と最も早く変化する次元の一辺の長さの積を取り、その値と次に早く変化する次元の一辺の長さとの積を取る、という操作を繰り返すからです。しかし、マップされた配列においてはNetCDF変数のディスク上での位置とメモリ上での位置との対応関係は異なることもあります。
下記のC言語での定義の場合を例に取りましょう。
struct vel {
int flags;
float u;
float v;
} vel[NX][NY];
ptrdiff_t imap[2] = {
sizeof(struct vel),
sizeof(struct vel)*NY
};
ここで、imapはインデックスマッピングベクトルであり、メモリ上に常駐しているNetCDF変数vel(NY,NX)にアクセスするのに使用できます。たとえ次元が入れ替わっていて、データが2次元の浮動小数点数ではなく2次元の配列構造を取っていても大丈夫です。
マップされた配列へのアクセスに関する詳しい例はマップされた配列へのアクセスに関するインターフェースの説明文にあります。7.9節 「マップされた配列の値を書き込む: NF_PUT_VARM_ type」(p.65)を参照して下さい。
NetCDF抽象化によって部分サンプルされた配列断面やマップされた配列断面によるアクセスが可能ですが、これらを使用する必要はありません。これらのより汎用的なアクセス法が不必要な場合には、これらの機能を無視して単一値によるアクセスや通常の配列断面アクセス方法を使用してください。
1 ベクトル[x0, x1, …, xn] と [y0, y1, …, yn] の内積は単にx0*y0+x1*y1+…+xn*ynとなります。
Quadralay Corporation http://www.webworks.com Voice: (512) 719-3399 Fax: (512) 719-3606 sales@webworks.com |