Instanciation d'un std::vector de boost::multi_array..le cerveau fondant pour le gourou du RPC ?

StackOverflow https://stackoverflow.com/questions/9023178

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

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top