2010-09-20 69 views
1

提升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服用與2*2=4非零元素僅20字節4x4 matrix(而不是8*4*4=128字節),而ublas::compressed_matrix正在56字節(而不是4*8=32字節)?

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

請幫助澄清。

回答

4

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

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

1

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

}