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のみを取得するのですか?204x4 matrix8*4*4=128ublas::compressed_matrix2*2=4564*8=32

また、でゼロ以外の要素の場所を指定する方法もわかりませんでしたublas::compressed_matrix。コンストラクターに設定されたゼロ以外の要素の数を超えて格納しようとするとどうなりますか?

明確にするのを手伝ってください。

4

3 に答える 3

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;
}
于 2010-09-20T19:53:04.263 に答える
1

sizeof()実行時のメモリ割り当てはわかりません。ublas::matix質問を完全に理解するには、との実装を知る必要がありますublas::compressed_matrix。どちらも基礎となるストレージ配列を持っています (ublas::::unbounded_arrayデフォルトでは、テンプレート パラメーターを指定することで他のものを選択できます)。とは異なりublas::matixublas::compressed_matrix行列の非ゼロ要素のみを格納します。

また、ublas::compressed_matrix でゼロ以外の要素の場所を指定する方法についても混乱しました。

イテレータを使用します。

コンストラクターで設定されたゼロ以外の要素の数を超えて格納しようとするとどうなりますか?

コンストラクターで設定されたゼロ以外の要素の数を超えて保存する方法がわかりません.3番目のパラメーターを意味する場合、それは基になるストレージ配列の事前に割り当てられたサイズです。

例えば:

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

}
于 2014-05-11T04:52:23.420 に答える
0

メモリは、次元情報と非ゼロの数が与えられたときに、compressed_matrix コンストラクターを呼び出すときに割り当てられます。また、マトリックスタイプの場合、後でマトリックスに要素を挿入すると、メモリが動的に割り当てられる可能性があります。

于 2014-05-11T03:25:58.557 に答える