ブースト ublas コードを調べたところ、メモリ割り当ての ublas 実装compressed_matrix
が CSC や CSR ほど標準的ではないことがわかりました。
問題の原因となる行が 1 つあります。つまり、
non_zeros = (std::max) (non_zeros, (std::min) (size1_,size2_));
privaterestrict_capactiy
メソッドにあります。
スパース行列を作成すると、ブースト 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;
}