7

boost::compressed_matrix の仕組みについて混乱しています。次のように compress_matrix を宣言するとします。

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

これにより、1000x1000 マトリックスの 3*1000 要素にスペースが割り当てられます。では、ゼロ以外の要素である場所をどのように指定すればよいでしょうか? 非ゼロ要素はいつ、どのように設定されますか? B(4,4)=4 など、行列に要素を割り当てるたびに、その要素が非ゼロとしてマークされますか?

可能であれば、例を使用してこれを学ぶのを手伝っていただければ幸いです。内部実装へのいくつかの洞察は素晴らしいでしょう。当て推量によって次善のプログラムを書かないようにしたいのです。

ありがとう!

4

2 に答える 2

4

圧縮された行列には、基になる線形コンテナーがあり(unbounded_arrayデフォルトでは作成できますが、必要に応じて作成できbounded_arrayますstd::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());
}
于 2010-09-21T23:21:21.160 に答える
1

演算子を使用(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番目の要素の値を消去します。

于 2010-09-21T23:16:43.183 に答える