Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在实例化boost::multi_数组的std::vector。。为cpp大师融化大脑?_C++_Boost_Vector_Boost Multi Array - Fatal编程技术网

C++ 正在实例化boost::multi_数组的std::vector。。为cpp大师融化大脑?

C++ 正在实例化boost::multi_数组的std::vector。。为cpp大师融化大脑?,c++,boost,vector,boost-multi-array,C++,Boost,Vector,Boost Multi Array,我想我对实例化对象感到困惑。。好。。对象不正确,因为new语句产生编译错误。我的背景是Python和java,我被C++前面的方法所创建的对象不是类。 我在翻译C#中的一个算法,用于机器学习,它使用多维数组 C#代码: 公共双重学习(int[][]观察、int符号、int状态。。。 // ... double[][,]epsilon=新的double[N][,];//也称为ksi或psi 双精度[][,]伽马=新双精度[N][,]; 对于(int i=0;i

我想我对实例化对象感到困惑。。好。。对象不正确,因为
new
语句产生编译错误。我的背景是Python和java,我被C++前面的方法所创建的对象不是类。 我在翻译C#中的一个算法,用于机器学习,它使用多维数组

C#代码:

公共双重学习(int[][]观察、int符号、int状态。。。
// ...
double[][,]epsilon=新的double[N][,];//也称为ksi或psi
双精度[][,]伽马=新双精度[N][,];
对于(int i=0;i
我决定将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]);
}
typedef boost::多数组矩阵x2d;
typedef boost::多_阵列矩阵x3d;
向量ε;
矢量伽马;
无法在之前执行
std::bad_alloc'什么():std::bad_alloc


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

epsilon[i] = matrix3D(boost::extents[T][states][symbols]);
gamma[i] = matrix2D(boost::extents[T][states]);
致:

这应该可以解决问题。在您的情况下,因为您知道数组大小,所以应该在向量中保留足够多的空间,以减少所需的重新分配:

epsilon.reserve(N);
gamma.reserve(N);

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

epsilon[i] = matrix3D(boost::extents[T][states][symbols]);
gamma[i] = matrix2D(boost::extents[T][states]);
致:

这应该可以解决问题。在您的情况下,因为您知道数组大小,所以应该在向量中保留足够多的空间,以减少所需的重新分配:

epsilon.reserve(N);
gamma.reserve(N);

什么是
观察值
状态
符号
?。在任何情况下,您都在写入
ε
伽马
,而没有最初调整
向量
的大小,因此这至少是一个明显的错误,但很可能不是导致您看到的异常的错误。什么是
观察值
状态s
符号
?。在任何情况下,您在写入
epsilon
gamma
时,最初没有调整
向量的大小,因此这至少是一个明显的错误,但可能不是导致您看到的异常的错误。他遇到了
std::bad_alloc
异常—写入
异常>std::vector
不会抛出该异常,所以我认为这不是答案。你是对的。我想你可以通过索引器得到,但这是一个下标超出范围的错误。这个答案修复了他遇到的另一个问题:)是的,问题是我没有初始化符号。但这就是我要问的:)他得到了一个
std::bad_alloc
异常——将越界写入
std::vector
不会抛出该异常,所以我认为这不是答案。你是对的。我想你可以用索引器得到,但那是一个下标超出范围的错误。这个答案解决了另一个问题:)是的,问题是我没有初始化符号。但这正是我想要的:)