0

行列の固有値を見つけるアルゴリズムを実装しようとすると、問題が発生します。プログラムは、連続する反復の問題で、2 つの補助行列を作成する必要があります。(私のプログラムでは t_mat および s_mat と呼ばれます)。そのために、std::vectors の std::vector を使用することにしました。これは同じ長さでなければなりません。私がやろうとしていることは、各ステップにあります:

1) すべてのベクトルを 1 行ずつ増やします。値は 0.0 です。

2) すべての要素が 0.0 の新しいベクトルを最後に追加します。

コードは次のようになります。

unsigned j_=0;
while (conv_measure > 0.001){
    (...)
        std::cout << "Step 5" << std::endl;
        unsigned temp_mat_size= t_mat.size();
        std::cout << "CP 1" << std::endl;
        std::cout << "temp mat size " << temp_mat_size << std::endl;
        for (size_t l_=0; l_ < temp_mat_size; l_++)
        {
            t_mat[l_].push_back(0.0); //Enlarge each vector by one row.
            s_mat[l_].push_back(0.0);
        }
        std::cout << "CP 2" << std::endl;
        vec_cont_t next_vec (temp_mat_size+1, 0.0); //matrix_size +1 entries with value 0.0
        std::cout << "CP 3" << std::endl;
        t_mat.push_back(next_vec);
        s_mat.push_back(next_vec);
    (...)
}

すべての std::cout ステートメントを無視してください。これらは、エラーを突き止めるためにのみ使用されました。プログラムは、正確に 3 回の反復で正常に実行されます。(したがって、上記のコードは 3 回機能します)。4 回目の繰り返しで、プログラムが eclipse でクラッシュし、次のメッセージが表示されます。

Band_Lanczos: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

残念ながら、C++、特にデバッグに関しては、私はまだ初心者です。そのメッセージが何を伝えようとしているのか、そもそもなぜプログラムがクラッシュするのか、私には何もわかりません。3回機能してから突然ダウンする理由がわかりません。double の 4x4 マトリックスのスペース要件は、使用可能なすべてのメモリを占有するほど大きくはありません。これを解決するために Valgrind を使用する必要があることを他の場所で読みましたが、これは私のスキルを超えています。

4

1 に答える 1