0

在尝试实现一种找到矩阵特征值的算法时,我遇到了一个问题:程序必须在连续迭代中建立两个辅助矩阵。(在我的程序中称为 t_mat 和 s_mat)。为此,我决定使用 std::vector 的 std::vector,它应该具有相等的长度。然后我想做的是在每一步:

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 语句。这些仅用于查找错误。该程序恰好在三个迭代中执行良好。(所以上面的代码工作了三次)。在第四次迭代中,程序在 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次然后突然下降。4x4 双精度矩阵的空间需求不足以占用所有可用内存。我在其他地方读到我应该使用 Valgrind 来解决这个问题,但这超出了我的技能。

4

1 回答 1

0

没有发布足够的代码来确定问题可能是什么。但是,以下说法是可疑的:

s_mat[l_].push_back(0.0);

该循环假定 s_mat 与 t_mat 的大小相同。如果 s_mat 比 t_mat 更小,那么这将导致未定义的行为。

于 2013-05-27T11:54:52.807 回答