0

行と列をfloat**含む配列があります。0から9までのすべての数字の出現回数を列ごとに調べたいと思います。これを行うために、サイズの別の2D配列を使用することを考えました。これにより、各列の要素に対応する数は、元のテーブルでのその数の出現数になります。例:元のテーブルの5番目の列に含まれている場合、2番目の列の値は次のようになります。num_rowsnum_cols[10][num_cols]1 2 3 1 11-> 3, 2 -> 1, 3 -> 1

次のように関数を使ってみましたが、ポインタエラーが発生します。ベクトルを使ってみましたが、それでもうまくいきません。

int ** attribute_count(float * * input, int row_num, int col_num) {
    int ** arr_2 = new int * [10];
    int * arr = new int[10 * col_num];
    int counter = 0;

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < col_num; j++) {
            arr_2[i][j] = 0;
        }
    }

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < col_num; j++) {
            int temp = input[i][j];
            arr_2[temp][j]++;
        }
    }
    return arr_2;
}

編集:私はあなたの提案を試しました。新しいコードは次のとおりです。

    int** attribute_count(float** input, int row_num, int col_num) {
    int** arr_2 = new int* [10];
    int* arr = new int[10 * col_num];
    int counter = 0;

    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < col_num; j++) {
            arr_2[i] = new int[col_num];
        }
    }

    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < col_num; j++) {
            int temp = input[i][j];
            arr_2[temp][j]++;
        }
    }
    return arr_2;
}

これでもメモリエラーが発生します。この関数は、次のように.cppで呼び出されます。

int** attr = attribute_count(training_data, 10, num_cols_train);
    cout<<attr[5][1];

私が今でも間違っていることについて何か考えはありますか?

4

3 に答える 3

1

arr_2は、intへのポインターの配列として定義および割り当てられますが、実際にはそれらのポインターを割り当て/割り当てません。

これがあなたのコードを修正するための刺し傷です-しかし私はあなたが正しい方法で行と列を持っているとは確信していません...

int ** attribute_count(float ** input, int row_num, int col_num)
{
int ** arr_2 = new int * [10];

    for (int i = 0; i < 10; i++)
    {
        arr_2[i] = new int[col_num];
        for(int j = 0 ; j < col_num ; j++)
        {
            arr_2[i][j] = 0;
        }
    }

    for (int i = 0; i < row_num; i++)
    {
        for (int j = 0; j < col_num; j++)
        {
            int temp = input[i][j];
            arr_2[temp][j]++;
        }
    }
    return arr_2;
}
于 2012-12-05T17:30:50.583 に答える
1

の次元を 1 つだけ割り当てましたarr_2。2 番目の次元を取得するには、ループしてそれぞれに int の配列を割り当てる必要があります。

編集:また、どうしたのarrですか?それを割り当て、決して使用せず、返さず、割り当てを解除しないでください。それがメモリリークの綴りです。

于 2012-12-05T17:32:34.883 に答える
1

あなたの問題は、2D配列の割り当てが正しくないことにあると思います。試す

int ** arr_2 = new int* [row_num];
for (int i = 0; i < row_num; i++)
    arr_2[i] = new int[col_num];
于 2012-12-05T17:33:15.913 に答える