Chapter 29 The bigarray libraryThe Objective Caml system release 3.10 bigarray ライブラリは、大規模で、多次元で、数値のみを扱うことのできる配列を実装しています。これらの配列は、標準の Caml の Array モジュールで提供されるものと区別するために "big array" と呼ばれます。big array とCaml 標準の配列との大きな違いは以下のものです。
bigarray ライブラリを使用するプログラムは次のようにリンクしてください。 ocamlc other options bigarray.cma other files
ocamlopt other options bigarray.cmxa other files
インタラクティブモードで str ライブラリを使うには以下のようにします。 ocamlmktop -o mytop bigarray.cma
./mytop
あるいは(あなたのプラットフォームが C ライブラリのダイナミックリンクをサポートする場合には)、ocaml を起動して #load "bigarray.cma";; と入力してください。 Module Bigarray: large, multi-dimensional, numerical arrays
Big arrays in the Caml-C interfaceC や Fortran のコードと Caml のコードを結びつける(18章で述べられています) C のスタブコードは、次のようにして big array を利用することができます。 Include fileC スタブファイルには必ず <caml/bigarray.h> をインクルードしなくてはいけ ません。これは、以下で述べる関数と定数とマクロを宣言します。 Accessing a Caml bigarray from C or Fortranもし v が big array を表す Caml の値だとすると、Data_bigarray_val(v) と いう式は配列のデータ部分へのポインタを返します。このポインタは void 型 で、適切な C の型にキャストすることができます。(例えば double [], char [][10], などなど) Caml の big array の様々な情報は、C で次のように得ることができます。
配列の要素の種類は、次の定数のうちのどれかです。
以下は、2次元の big array を C と Fortran の関数に渡す例です。 extern void my_c_function(double * data, int dimx, int dimy);
extern void my_fortran_function_(double * data, int * dimx, int * dimy);
value caml_stub(value bigarray)
{
int dimx = Bigarray_val(bigarray)->dim[0];
int dimy = Bigarray_val(bigarray)->dim[1];
/* C passes scalar parameters by value */
my_c_function(Data_bigarray_val(bigarray), dimx, dimy);
/* Fortran passes all parameters by reference */
my_fortran_function_(Data_bigarray_val(bigarray), &dimx, &dimy);
return Val_unit;
}
Wrapping a C or Fortran array as a Caml big array既にメモリ領域が割り当てられた C や Fortran の配列へのポインタ p は、 alloc_bigarray や alloc_bigarray_dims 関数を使って Caml の世界に持って 帰ることができます。
以下は、静的に割り当てられた C と Fortran の配列をどうやって Caml から扱えるようにするかを表した例です。 extern long my_c_array[100][200];
extern float my_fortran_array_[300][400];
value caml_get_c_array(value unit)
{
long dims[2];
dims[0] = 100; dims[1] = 200;
return alloc_bigarray(BIGARRAY_NATIVE_INT | BIGARRAY_C_LAYOUT,
2, my_c_array, dims);
}
value caml_get_fortran_array(value unit)
{
return alloc_bigarray_dims(BIGARRAY_FLOAT32 | BIGARRAY_FORTRAN_LAYOUT,
2, my_fortran_array_, 300L, 400L);
}
|