1

我深入研究了 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;
}
4

1 回答 1

0

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

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

因为这个想法是要杀死密集矩阵的 $N^2$ 缩放。一个很好的猜测是,在稀疏矩阵中,您将使用 $N^2$ 中或多或少的 $N$ 个元素。如果您使用超过 $N$,那么重新分配将在某个时候发生,但次数不会那么多。但是,您可能会遇到这种情况,无论如何最好切换到密集矩阵。

更令人惊讶的是它覆盖了传递的值。但是,上述情况仍然适用。

于 2014-08-10T01:14:12.740 回答