إنشاء مثيل std::vector للتعزيز::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]);
}

وأحصل على خطأ وقت التشغيل هذا:

هم::تعلم >> قبل
ستد::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