1

我想我对实例化对象感到困惑..好吧..不是正确的对象,因为new语句会产生编译错误。我的背景是 Python 和 Java,我被 C++ 创建非类对象的方式所困。

我正在从 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]);
}

我得到这个运行时错误:

HMM::learn >> 在
std::bad_alloc' what(): std::bad_alloc之前

4

1 回答 1

1

向量没有分配空间(它可能已经被保留,但你不能用数组索引器引用它)。更改行:

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);
于 2012-01-26T18:52:52.783 回答