我正在创建CSR格式的稀疏矩阵,为此我从矩阵元素结构的向量开始。首先需要将其设置为std :: vector,因为我不提前知道矩阵将有多少个非零值。然后,要为CSR矩阵填充适当的数组,我需要首先对这个非零数组进行排序,如果它们逐行通过,则它们按出现在矩阵中的顺序排列。但是,在一定的矩阵大小(大约为1 500 000非零)以上时,排序后的向量并不从矩阵的开头开始。它仍在排序,但从44000行开始。
// Matrix element struct:
struct mel
{
int Ncols;
int row,col;
MKL_Complex16 val;
void print();
};
// Custom function for sorting:
struct less_than_MElem
{
inline bool operator() (const mel& ME1, const mel& ME2)
{
return ( ( ME1.row*ME1.Ncols+ME1.col ) < ( ME2.row*ME2.Ncols+ME2.col ) );
}
};
int main()
{
std::vector<mel> mevec;
/* long piece of code that fills up mevec */
std::sort( mevec.begin(), mevec.end(), less_than_MElem() );
return 0;
}
我认为也许随着向量的动态增长,它缠绕在内存中的单独块中,并且迭代器不再指向真正的开始/结束。因此,我尝试创建一个新的向量,并开始将其调整为当时已知的大小。然后将元素一一复制到此新向量中并进行排序,但结果相同。
Nelements = mevec.size();
std::vector<mel> nzeros;
nzeros.resize(Nelements);
for( int i = 0; i < Nelements; i++ )
{
nzeros[i].Ncols = mevec[i].Ncols;
nzeros[i].row = mevec[i].row;
nzeros[i].col = mevec[i].col;
nzeros[i].val = mevec[i].val;
}
std::sort( nzeros.begin(), nzeros.end(), less_than_MElem() );
谁能想到解决方案?