2012-11-12 2 views
0

Salut J'ai quelques boost :: multi_array défini comme ci-dessous:C++: Comment avoir un tableau de boost :: multi_array

typedef boost::multi_array<double, 3> region_prior_integral_image 

Je suis en train de créer un tableau de region_prior_integral_image comme ce qui suit:

unordered_map<string, int> filename_to_hash_key_map = get_filename_to_hash_key_map(); 

unordered_map<string, region_prior_integral_image> filename_to_region_prior_map = get_region_prior_integral_images(); 

region_prior_integral_image* image_cache = new region_prior_integral_image[5]; 
for(unordered_map<string, int>::iterator it = filename_to_hash_key_map.begin(); it != filename_to_hash_key_map.end(); it++){ 
    image_cache[it->second] = filename_to_region_prior_map[it->first]; 
} 

Toutefois, le programme se termine par ce qui suit: SemanticTextonForest: /home/aly/libs/boost_1_51_0/stage/include/boost/multi_array/multi_array_ref.hpp:488: boost::multi_array_ref<T, NumDims>& boost::multi_array_ref<T, NumDims>::operator=(const ConstMultiArray&) [with ConstMultiArray = boost::multi_array<double, 3ul>, T = double, long unsigned int NumDims = 3ul, boost::multi_array_ref<T, NumDims> = boost::multi_array_ref<double, 3ul>]: Assertion std :: égal (other.shape(), other.shape() + this-> num_dimensions(), this-> forme()) » failed.`

Et Je ne sais pas pourquoi?

Je sais que je pouvais utiliser un vecteur, mais pour l'amour arguments permet de dire que je voulais avoir un tableau de region_prior_integral_images

Merci

Répondre

1

Disons que nous avons deux cas region_prior_integral_image: A et B. Si vous voulez affecter B à A, comme A = B;, les formes de A et B doivent être égales. Le message d'erreur indique que, dans votre code image_cache[it->second] = filename_to_region_prior_map[it->first];, les deux tableaux sont de formes différentes.

Comment avez-vous créé les tableaux dans filename_to_region_prior_map? Je suppose que vous avez utilisé ce constructeur pour spécifier les formes: multi_array<double,3> B(boost::extents[i][j][k]). D'où leur forme est [i][j][k]. Mais lorsque vous créez le image_cache, le constructeur par défaut est appelé. Donc, les deux formes ne correspondent pas.

Mon avis est de stocker des pointeurs de region_prior_integral_image dans votre code, ce qui permettra d'économiser beaucoup de copie ainsi.

+0

une idée de comment obtenir les dimensions d'une image_prior_fr déjà créée? – Aly

+0

Utiliser 'const size_type * \t \t shape() const;' comme: 'auto s = A.shape();', alors vous pouvez y accéder par 's [0]', 's [1]' et 's [2] 'dans votre cas. Il vaut mieux lire la référence officielle: http://www.boost.org/doc/libs/1_52_0/libs/multi_array/doc/reference.html –

+0

Comment créer le tableau de region_prior_images d'une taille donnée? – Aly

Questions connexes