我认为我对实例化对象感到困惑..好吧..不正确的对象,因为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&gt;&gt;
前 std :: bad_alloc'what():std :: bad_alloc
答案 0 :(得分: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);