Создание экземпляра std::vector of boost::multi_array..плавление мозгов для гуру cpp?

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

Вопрос

Я думаю, что я запутался в создании экземпляров объектов.хорошо..не правильно возражать, потому что new операторы вызывают ошибку компиляции.Мой опыт работы с Python и Java, и я застрял на C ++, способе создания объектов, которые не являются классами.

Я перевожу алгоритм с 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];
    }

Я решил использовать библиотеку Boost для многомерного массива, и у меня есть:

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

и я получаю эту ошибку времени выполнения:

ХМ::узнай >> раньше
std::bad_alloc' что():станд::bad_alloc

Это было полезно?

Решение

Векторам не выделено пространство (ну, оно может уже зарезервировано, но вы не можете ссылаться на него с помощью индексаторов массива).Измените строки:

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

это должно решить проблему.В вашем случае, поскольку вы знаете размер массива, вам следует зарезервировать столько места в векторах, чтобы уменьшить необходимые перераспределения:

epsilon.reserve(N);
gamma.reserve(N);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top