Instanciation d'un std::vector de boost::multi_array..le cerveau fondant pour le gourou du RPC ?
-
14-11-2019 - |
Question
Je pense que je suis confus avec l'instanciation d'objets.Bien..ne pas s'opposer correctement parce que new
les instructions génèrent une erreur de compilation.Mon expérience est en Python et Java et je suis coincé devant la manière C++ de créer des objets qui ne sont pas des classes.
Je traduis un algorithme de C# et pour l'apprentissage automatique et il utilise un tableau de tableaux multidimensionnels.
Code C# :
public double Learn(int[][] observations, int symbols, int states, ...
// ...
double[][, ,] epsilon = new double[N][, ,]; // also referred as ksi or psi
double[][,] gamma = new double[N][,];
for (int i = 0; i < N; i++)
{
int T = observations[i].Length;
epsilon[i] = new double[T, States, States];
gamma[i] = new double[T, States];
}
J'ai décidé d'utiliser la bibliothèque Boost pour le tableau multidimensionnel, et j'ai :
typedef boost::multi_array<double, 2> matrix2D;
typedef boost::multi_array<double, 3> matrix3D;
vector<matrix3D> epsilon;
vector<matrix2D> gamma;
cout << "HMM::learn >> before" << endl;
for (int i = 0; i < N; i++)
{
int T = observations[i].size();
epsilon[i] = matrix3D(boost::extents[T][states][symbols]);
gamma[i] = matrix2D(boost::extents[T][states]);
}
et j'obtiens cette erreur d'exécution :
HMM::apprendre >> avant
std::bad_alloc' quoi() :std :: bad_alloc
La solution
Les vecteurs n'ont pas d'espace alloué (enfin, il est peut-être déjà réservé mais vous ne pouvez pas le référencer avec les indexeurs de tableau).Changez les lignes :
epsilon[i] = matrix3D(boost::extents[T][states][symbols]);
gamma[i] = matrix2D(boost::extents[T][states]);
À:
epsilon.push_back(matrix3D(boost::extents[T][states][symbols]);
gamma.push_back(matrix2D(boost::extents[T][states]);
cela devrait le résoudre.Dans votre cas, puisque vous connaissez la taille du tableau, vous devez réserver autant d'espace dans les vecteurs afin de réduire les réallocations nécessaires :
epsilon.reserve(N);
gamma.reserve(N);