Frage

Nachdem ich die Dokumentation angesehen habe, kann ich dieses nicht herausfinden.

Ich kann Code schreiben, z.

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;

Dann kann ich über die Typen auf eine 2D -Scheibe zugreifen data_2d_subarray_t oder data_2d_view_t.

Was ist der Unterschied zwischen ihnen ?
Was kann ich mit einem machen, was ich mit dem anderen nicht machen kann?
Gibt es einen Leistungsunterschied?

Vielen Dank, dass Sie mir dies klargestellt haben. Mit freundlichen Grüßen, Rodrigob.

War es hilfreich?

Lösung

Aus der Tabelle von Multiview -zugeordnete Typen:

Referenz Dies ist der Referenztyp des enthaltenen Wertes. Wenn Numdims == 1, dann ist dies Element &. Andernfalls ist dies der gleiche Typ wie Vorlage Subarray :: Typ.

Vorlagenarray_View :: Typ Dies ist der Ansichtstyp mit Dims -Dimensionen. Es wird vom Anrufbetreiber zurückgegeben. Es modelliert Multiarray.

Also sind sie zunächst unterschiedliche Typen. In diesem Zusammenhang repräsentieren Ansichten eine Art Unterkollektion eines Multiarray. Sie implementieren das Multiarray -Konzept, aber die Elemente, die sie enthalten, sind tatsächlich Elemente eines anderen Multiarray. Mit Ansichten können Sie ein neues definieren Index in die Elemente eines Multiarray. Sie können beispielsweise eine Ansicht definieren, die den Index umkehrt, so dass das erste Element der Ansicht das letzte Element des Multiarray ist. Von dem Dokumentation:

Mit einer Ansicht können Sie eine Teilmenge der zugrunde liegenden Elemente in einem Multiarray behandeln, als wäre es ein separates Multiarray. Da sich eine Ansicht auf die gleichen zugrunde liegenden Elemente bezieht, werden Änderungen an den Elementen einer Ansicht im ursprünglichen Multiarray widerspiegelt.

Multiarrays werden rekursiv definiert; ein Multiarray der Dimension n > 1 kann als Array von Multiarrrays der Dimension betrachtet werden n-1, das sind Subarrays. Der wichtigste Unterschied zwischen einer Subaarrray und einer Ansicht besteht darin, dass Sie ein Multiarray in die unteren Abmessungen entlang einer beliebigen Achse, einschließlich der Hauptachse, in Ansichten schneiden können, aber Subarrays können nicht entlang der Hauptachse geschnitten werden.

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];

Ich glaube nicht, dass es einen großen Leistungsunterschied gibt, obwohl dies davon abhängt, welche Art von Index Sie beim Erstellen einer Ansicht verwenden. Ansichten sind vielleicht etwas weniger leistungsfähig, aber nicht im großen Sinne.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top