为什么boost ublas中的compress_matrix分配了比非零元素更多的内存

Why the compress_matrix in boost ublas allocate more memory that it needed for nonzero elements?

本文关键字:元素 内存 中的 ublas boost compress 分配 matrix 为什么      更新时间:2023-10-16

我深入研究了boost ublas代码,发现compressed_matrix中用于内存分配的ublas实现不像CSC或CSR中那样标准。

有一行引起了麻烦,即:private restrict_capactiy方法中的non_zeros = (std::max) (non_zeros, (std::min) (size1_,size2_));

这是否意味着如果我创建一个稀疏矩阵,在boost ubla中分配的非零数量将始终大于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;
}

也许这是考虑到某些用例的性能设计选择。

这个想法是,当填充compressed_matrix时,可以尝试最小化维护索引/值数组的数组的重新分配。如果从0开始分配空间,它会很快地投机性地重新分配一次(例如,每次超过分配的空间时保留两倍的空间,就像std::vector一样)。

因为这个想法是为了消除密集矩阵的N^2缩放。一个很好的猜测是,在一个稀疏矩阵中,你将从$N^2$中使用或多或少$N$元素。如果你使用了多于$N$,那么重新分配将在某个时间点发生,但次数不会那么多。但是,你可能会遇到这样的情况:无论如何,最好还是切换到密集矩阵。

更令人惊讶的是,它覆盖了传递的值。