簡體   English   中英

增強壓縮矩陣存儲

[英]boost compressed matrix storage

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僅占用20個字節用於4x4 matrix (而不是8*4*4=128字節),而ublas::compressed_matrix具有2*2=4個非零元素卻占用了56個字節(而不是4*8=32字節)?

我也很困惑如何在ublas::compressed_matrix指定非零元素的位置。 如果我嘗試存儲的數量超過構造函數中設置的非零元素的數量,會發生什么?

請幫助澄清。

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;
}

sizeof()在運行時不知道內存分配。 要完全理解該問題,您需要了解ublas::matixublas::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';
    }

}

給定尺寸信息和非零數時,在調用compressed_matrix構造函數時會分配內存。 對於矩陣類型,稍后在矩陣中插入元素時,可能會動態分配內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM