2010-11-18 16 views
11

Dopo aver esaminato la documentazione, non riesco a capirlo.Qual è la differenza tra boost :: multi_array views and subarrays

posso scrivere codice come

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; 

Allora posso accedere a una fetta 2d utilizzando tramite i tipi data_2d_subarray_t o data_2d_view_t.

Qual è la differenza tra loro?
Cosa posso fare con uno che non posso fare con l'altro?
C'è qualche differenza di prestazioni?

Grazie mille per chiarirmi questo. Cordiali saluti, rodrigob.

risposta

5

Dalla tabella di MultiView associated types:

riferimento Questa è il tipo di riferimento del valore contenuto. Se NumDims == 1, questo è l'elemento &. Altrimenti, questo è lo stesso tipo di template subarray :: type.

template array_view :: type Questo è il tipo di vista con dimensioni Dims. Viene restituito chiamando l'operatore. Modelli MultiArray.

quindi sono tipi diversi, per cominciare. In questo contesto, le viste rappresentano una sorta di sottoraccolta di un MultiArray. Implementano il concetto MultiArray, ma gli elementi che contengono sono in realtà elementi di altri MultiArray. Le viste consentono di definire un nuovo index negli elementi di un MultiArray. Ad esempio, è possibile definire una vista che inverta l'indice, in modo che il primo elemento della vista sia l'ultimo elemento del MultiArray. Da documentation:

Una vista consente di trattare un sottoinsieme degli elementi sottostanti in un MultiArray come se fosse un MultiArray separato. Poiché una vista si riferisce agli stessi elementi sottostanti, le modifiche apportate agli elementi di una vista si rifletteranno nel MultiArray originale.

MultiArray sono definiti in modo ricorsivo; un MultiArray di dimensioni n> 1 può essere pensato come una matrice di MultiArray di dimensione n -1, che sono sottoarray. La differenza chiave tra un sottoarray e una vista è che è possibile suddividere un MultiArray in viste di dimensioni inferiori lungo qualsiasi asse, incluso l'asse maggiore, ma i sottotitoli non possono essere tagliati lungo l'asse maggiore.

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

Non credo ci sia alcuna differenza sostanziale le prestazioni, anche se questo dipende da che tipo di indice si utilizza quando si crea una vista. Le viste potrebbero essere leggermente meno performanti, ma non in senso ampio.

+0

Grazie per la risposta! Questo è esattamente quello che stavo cercando! Anche se sulla base della mia precedente esperienza http://stackoverflow.com/questions/446866/boostmulti-array-performance-question/4220976#4220976, penserei che in generale i sottoarray sono molto più performanti dei punti di vista (in un "k sul lato" del grande senso "O"). – rodrigob

Problemi correlati