我深入研究了 boost ublas 代码,发现用于内存分配的 ublas 实现compressed_matrix
不像 CSC 或 CSR 那样标准。
有一条线引起了麻烦,即
non_zeros = (std::max) (non_zeros, (std::min) (size1_,size2_));
在私有restrict_capactiy
方法中。
这是否意味着如果我创建一个稀疏矩阵,则在 boost ublas 中分配的非零数将始终大于min(nrow, ncol)
?
下面的代码我用来演示这个问题。输出将在compressed_matrix 中分配的向量的未使用部分为零。
typedef boost::numeric::ublas::compressed_matrix<double, boost::numeric::ublas::column_major,0,std::vector<std::size_t>, std::vector<double> > Matrix;
long nrow = 5;
long ncol = 4;
long nnz = 2;
Matrix m(nrow, ncol, nnz);
cout<<"setting"<<endl;
m(1,2) = 1.1;
m(2,2) = 2.1;
for(int i=0;i<m.index1_data().size();i++)
{
cout<<"ind1 -"<<i<<" "<<m.index1_data()[i]<<endl;
}
for(int i=0;i<m.index2_data().size();i++)
{
cout<<"ind2 -"<<i<<" "<<m.index2_data()[i]<<endl;
}
for(int i=0;i<m.value_data().size();i++)
{
cout<<"val -"<<i<<" "<<m.value_data()[i]<<endl;
}