首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提升压缩矩阵存储

提升压缩矩阵存储
EN

Stack Overflow用户
提问于 2010-09-20 18:55:02
回答 3查看 983关注 0票数 1

boost ublas::compressed_matrix应该只为非零元素分配空间。但是在下面的例子中,我得到了奇怪的结果。

代码语言:javascript
复制
#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::matix4x4 matrix只采用20字节(而不是8*4*4=128字节),而具有2*2=4非零元素的ublas::compressed_matrix则采用56字节(而不是4*8=32字节)?

我还困惑于如何在ublas::compressed_matrix中指定非零元素的位置。如果我试图存储超过构造函数中设置的非零元素的数量,会发生什么?

请帮我澄清一下。

EN

回答 3

Stack Overflow用户

发布于 2010-09-21 03:53:04

sizeof()是一个编译时操作符,它只查看对象的直接大小,而不查看对象在运行时可能进行的任何分配。例如:

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2014-05-11 12:52:23

sizeof()不知道运行时的内存分配。要完全理解这个问题,您需要了解ublas::matixublas::compressed_matrix的实现,它们都有一个底层存储阵列(默认情况下是ublas::::unbounded_array,您可以通过指定模板参数选择其他存储阵列)。与ublas::matix不同,ublas::compressed_matrix只存储矩阵的非零元素。

我也搞不懂如何在ublas::compressed_matrix中指定非零元素的位置。

使用迭代器。

如果我试图存储超过构造函数中设置的非零元素的数量,会发生什么?

我不明白如何存储超过构造函数中设置的非零元素的数量,如果你指的是第三个参数,它只是底层存储数组的预分配大小。

例如:

代码语言:javascript
复制
#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';
    }

}
票数 1
EN

Stack Overflow用户

发布于 2014-05-11 11:25:59

当给定维度信息和非零数时,将在调用compressed_matrix构造函数时分配内存。对于矩阵类型,内存可能是稍后在矩阵中插入元素时动态分配的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3750722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档