在尝试实现一种找到矩阵特征值的算法时,我遇到了一个问题:程序必须在连续迭代中建立两个辅助矩阵。(在我的程序中称为 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 来解决这个问题,但这超出了我的技能。