boost::multi_array

コンストラクタの第二引数として boost::fortran_storage_order()を渡せば、内部データの配列順が列ベースになる = fortran関数(mklとか)に渡せる

boost::multi_arrayの起点変更

初期化またはresize時にmulti_array::extent_rangeで指定できる

using array_type = boost::multi_array<double, 3>;
using range = array_type::extent_range;

array_type test_array[ boost::extents[range(-1, 10)][range(2, 5)][3] ];
// サイズが[11]x[4]x[3]の[-1から10]、[2から5]、[0から3]のmulti_arrayができる

もしくは reindex() を呼び出してもいい

test_array.reindex(1); // 全て1始まりに変更

boost::array<array_type::index, 3> bases = {{0, 1, -1}};
test_array.reindex(bases); // 0始まり、1始まり、-1始まりに変更

起点のインデックスは .index_bases() で取得できる

auto bases = test_array.index_bases(); // boost::array<array_type::index, 3>が返ってくる
std::cout << boost::format("bases = %d, %d, %d") % bases[0] % bases[1] % bases[2] << endl;

終点のインデックスは bases[0] + test_array.shape()[0] - 1 になる