为什么boost ublas中的compress_matrix分配了比非零元素更多的内存
Why the compress_matrix in boost ublas allocate more memory that it needed for nonzero elements?
我深入研究了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)
?
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$,那么重新分配将在某个时间点发生,但次数不会那么多。但是,你可能会遇到这样的情况:无论如何,最好还是切换到密集矩阵。
更令人惊讶的是,它覆盖了传递的值。
相关文章:
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- std::unordered_set 中的元素如何存储在C++内存中?
- 使用指针访问参数接收的结构中的元素时内存泄漏
- 存储 std::list 元素的地址;内存
- MPI_Get仅从共享内存区域读取数组的第一个元素
- C++:指针元素的向量在销毁时是否会自动释放每个指针所指向的动态内存?
- 在数组中移动一系列元素,无需额外内存
- C++释放矢量元素占用的内存时遇到的麻烦
- 从矢量中最快的擦除元素或更好地利用内存(排序基数)
- 独立于元素内存管理的向量上的函数
- 关于内存管理的QT5元素的正确用法
- 分配到STD ::向量元素会导致内存腐败
- 如何根据STL列表中的元素数量分配内存
- 为什么要指向数组或向量中最后一个元素之后的内存位置
- 我可以确保矢量元素始终在内存中吗?
- 我怎么知道基类对象的指针数组中元素的类型,它将为派生类分配内存
- std:删除元素后,字符串容量保持不变,所以它是否占用了一些内存