2012-01-26 16 views
1

newステートメントでコンパイルエラーが発生するため、私はオブジェクトのインスタンス化と混乱していると思います。私の背景はPythonとJavaであり、クラスではないオブジェクトを作成するC++の方法の前で立ち往生しています。boost :: multi_arrayのstd :: vectorをインスタンス化する... cppの教祖の脳を溶かす?

私は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

'observations'とは何ですか? '状態'? 'シンボル'? [SSCCE](http://sscce.org/)。いずれにしても、最初に 'vectors'をサイジングせずに' epsilon'と 'gamma'に書き込んでいるので、あなたは見ている例外を引き起こすものではありません。 – ildjarn

+0

btw、私は編集しました – 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

関連する問題