簡體   English   中英

提升壓縮矩陣基礎知識

[英]boost compressed matrix basics

我對boost :: compressed_matrix的工作原理感到困惑。 假設我像這樣聲明compressed_matrix:

boost::numeric::ublas::compressed_matrix<double> T(1000, 1000, 3*1000);

這為1000x1000矩陣中的3 * 1000個元素分配空間。 現在我該如何給它提供非零元素的位置? 何時以及如何設置非零元素? 是每次我在矩陣中分配一個元素,例如B(4,4)= 4,它會將該元素標記為非零嗎?

如果可能的話,如果你可以幫助我學習這個例子,我將非常感激。 對內部實施的一些見解會很棒。 我想確保我不會通過猜測來編寫次優的程序。

謝謝!

壓縮矩陣有一個基礎線性容器(默認情況下為unbounded_array ,但如果需要,可以使它成為bounded_arraystd::vector ),它包含矩陣的所有非零元素,按行(默認)順序排列。 這意味着無論何時將新的非零元素寫入壓縮矩陣,都會將其插入到底層數組中。 如果您沒有按(行 - 主要)順序填充矩陣,則每個插入都將為O(n)。 當您更改現有的非零元素時,只需在基礎數組中進行更改。

這是一個簡單的測試,看看底層結構是什么樣的:

#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/storage.hpp>
namespace ublas = boost::numeric::ublas;
void show_array(const ublas::unbounded_array<double>& a)
{
    for(size_t i=0; i<a.size(); ++i)
            std::cout << a[i] << ' ';
    std::cout << '\n';
}
int main()
{
    ublas::compressed_matrix<double> m (10, 10, 3 * 10);
    m(0, 5) = 1; // underlying array is {1, 0, 0, 0, ...}
    show_array(m.value_data());
    m(0, 6) = 2; // underlying array is {1, 2, 0, 0, ...}
    show_array(m.value_data());
    m(0, 4) = 3;  // underlying array is {3, 1, 2, 0, ...}
    show_array(m.value_data());
    m(0, 4) = 7;  // underlying array is {7, 1, 2, 0, ...}
    show_array(m.value_data());
}

您可以使用(i,j)運算符隱式創建非零元素,也可以使用insert_element函數顯式插入元素。

最好的地方實際上是看內部實現:

http://www.tena-sda.org/doc/5.2.2/boost/d2/db7/matrix__sparse_8hpp-source.html#l02761

true_reference insert_element(size_type i,size_type j,const_reference t)

在第i行的第j個元素處插入值t。 不允許重復元素。


void erase_element(size_type i,size_type j)

刪除第i行的第j個元素的值。

暫無
暫無

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

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