2012-01-26 30 views
1

我觉得我很困惑实例化对象..以及..不正确的对象,因为new语句会产生编译错误。我的背景是在Python和Java中,我被困在C++创建不是类对象的方式之前。实例化boost :: multi_array的std :: vector :: cpp guru的大脑融化?

我正在翻译从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 >> before
std::bad_alloc' what(): std::bad_alloc

+1

什么是“观察”? 'states'? 'symbols'? [SSCCE](http://sscce.org/)。无论如何,你在写入'epsilon'和'gamma'时都没有首先确定'vectors'的大小,所以这至少是一个明显的错误,但可能不是导致你所看到的异常的错误。 – ildjarn

+0

顺便说一句,我编辑了 – nkint

回答

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); 
+0

他得到一个'std :: bad_alloc'异常 - 写出一个'std :: vector <>'不会抛出异常,所以我不认为这是回答。 – ildjarn

+0

你是对的。我以为你会用索引器得到它,但这是一个下标超出范围的错误。那么,这个答案解决了他的另一个问题:) – pstrjds

+0

是的问题是我没有初始化符号。但这是我所要求的:) – nkint

相关问题