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 に答える