boost ublas::compressed_matrix应该只为非零元素分配空间。但是在下面的例子中,我得到了奇怪的结果。
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>
using namespace std;
using namespace boost::numeric::ublas;
int main () {
{
compressed_matrix<double,row_major> m (4, 4, 2*2);
cout << sizeof(m) << "\n"; // prints 56
cout << m << std::endl;
}
{
matrix<double> m (4, 4);
cout << sizeof(m) << "\n"; // prints 20
cout << m << std::endl;
}
return 0;
}为什么ublas::matix对4x4 matrix只采用20字节(而不是8*4*4=128字节),而具有2*2=4非零元素的ublas::compressed_matrix则采用56字节(而不是4*8=32字节)?
我还困惑于如何在ublas::compressed_matrix中指定非零元素的位置。如果我试图存储超过构造函数中设置的非零元素的数量,会发生什么?
请帮我澄清一下。
发布于 2010-09-21 03:53:04
sizeof()是一个编译时操作符,它只查看对象的直接大小,而不查看对象在运行时可能进行的任何分配。例如:
class SizeTest
{
public:
char* m_pData;
SizeTest()
{
m_pData = new char[1000];
}
};
int main (void)
{
SizeTest Test;
cout << sizeof(Test) << "\n"; //Probably prints 4 depending on your system
return 0;
}发布于 2014-05-11 12:52:23
sizeof()不知道运行时的内存分配。要完全理解这个问题,您需要了解ublas::matix和ublas::compressed_matrix的实现,它们都有一个底层存储阵列(默认情况下是ublas::::unbounded_array,您可以通过指定模板参数选择其他存储阵列)。与ublas::matix不同,ublas::compressed_matrix只存储矩阵的非零元素。
我也搞不懂如何在ublas::compressed_matrix中指定非零元素的位置。
使用迭代器。
如果我试图存储超过构造函数中设置的非零元素的数量,会发生什么?
我不明白如何存储超过构造函数中设置的非零元素的数量,如果你指的是第三个参数,它只是底层存储数组的预分配大小。
例如:
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/storage.hpp>
namespace ublas = boost::numeric::ublas;
int main()
{
ublas::compressed_matrix<double> m(4, 4, 2*2);
m(1,2) = 3.5;
std::cout << m.value_data().size() << '\n';
typedef ublas::compressed_matrix<double>::iterator1 it1_t;
typedef ublas::compressed_matrix<double>::iterator2 it2_t;
for (it1_t it1 = m.begin1(); it1 != m.end1(); it1++)
{
for (it2_t it2 = it1.begin(); it2 != it1.end(); it2++)
{
std::cout << "(" << it2.index1() << "," << it2.index2() << ") = ";
std::cout << *it2 << std::endl;
}
}
{
ublas::matrix<double> m(4,4);
std::cout << m.data().size() << '\n';
}
{
ublas::compressed_matrix<double> m(4, 4, 5*5);
std::cout << m.value_data().size() << '\n';
}
}发布于 2014-05-11 11:25:59
当给定维度信息和非零数时,将在调用compressed_matrix构造函数时分配内存。对于矩阵类型,内存可能是稍后在矩阵中插入元素时动态分配的。
https://stackoverflow.com/questions/3750722
复制相似问题