12

ドキュメントを見た後、私はこれを理解できません。

のようなコードを書くことができます

typedef boost::multi_array<boost::int32_t, 3> data_t;

// 3d --
typedef data_t::array_view<3>::type data_3d_view_t;

// 2d --
typedef data_3d_view_t::reference data_2d_subarray_t;
typedef data_t::array_view<2>::type data_2d_view_t;

data_2d_subarray_t次に、タイプまたはを使用して 2D スライスにアクセスできますdata_2d_view_t

それらの違いは何ですか?
もう一方ではできないことで何ができますか?
性能差はありますか?

これを私に明確にしてくれてありがとう。よろしく、ロドリゴブ。

4

1 に答える 1

5

MultiView関連タイプの表から:

referenceこれは、含まれている値の参照タイプです。NumDims == 1の場合、これはelement&です。それ以外の場合、これはテンプレートsubarray::typeと同じタイプです。

template array_view :: typeこれは、Dimsディメンションを持つビュータイプです。オペレーターを呼び出すことによって返されます。MultiArrayをモデル化します。

そもそも、それらは異なるタイプです。このコンテキストでは、ビューはMultiArrayの一種のサブコレクションを表します。これらはMultiArrayの概念を実装していますが、それらに含まれる要素は実際には他のMultiArrayの要素です。ビューを使用すると、MultiArrayの要素に新しいインデックスを定義できます。たとえば、インデックスを逆にするビューを定義して、ビューの最初の要素がMultiArrayの最後の要素になるようにすることができます。ドキュメントから:

ビューを使用すると、MultiArrayの基になる要素のサブセットを、別個のMultiArrayであるかのように扱うことができます。ビューは同じ基になる要素を参照するため、ビューの要素に加えられた変更は元のMultiArrayに反映されます。

MultiArrayは再帰的に定義されます。次元n >1のMultiArrayは、サブ配列である次元n -1のMultiArrayの配列と考えることができます。サブアレイとビューの主な違いは、マルチアレイを主軸を含む任意の軸に沿って低次元のビューにスライスできることですが、サブアレイは主軸に沿ってスライスすることはできません。

data_t d3(boost::extents[4][5][6]);
data_2d_view_t d2_view = d3[boost::indices[range(0,4,2)][1][range(0,6,3)]];
data_2d_subarray_t d2_sub = d3[1];
// the following, and anything like it, won't work 
data_2d_subarray_t d2_sub_b = d3[range(0,4,2)][0];

ビューを作成するときに使用するインデックスのタイプによって異なりますが、パフォーマンスに大きな違いはないと思います。ビューのパフォーマンスは少し低下する可能性がありますが、大きな意味ではありません。

于 2010-11-21T04:04:14.597 に答える