3

ブースト行列の配列をメンバー変数として定義するにはどうすればよいですか?

次のどれも機能しませんでした。

boost::numeric::ublas::matrix<double> arrayM(1, 3)[arraySize];
boost::numeric::ublas::matrix<double>(1, 3) arrayM[arraySize];
boost::numeric::ublas::matrix<double> arrayM[arraySize](1, 3);

ありがとう、ラヴィ。

4

4 に答える 4

3

初期化するサイズは、型とは関係ありません。したがって:

// this makes things easier!
typedef boost::numeric::ublas::matrix<double> matrix_type;

// this is the type (no initialization)
matrix_type arrayM[arraySize];

問題は、配列の初期化に伴います。あなたはこれを行うことはできません:

TheClass::TheClass() :
arrayM(1, 3) // nope
{}

代わりに、デフォルトで構築してから、すべてのサイズを変更する必要があります。

TheClass::TheClass()
{
    std::fill(arrayM, arrayM + arraySize, matrix_type(1, 3));
}

ブーストを使用しているboost::arrayので、より良い構文が得られるため、 の使用を検討してください。

typedef boost::numeric::ublas::matrix<double> matrix_type;
typedef boost::array<matrix_type, arraySize> matrix_array;

matrix_array arrayM; // ah

TheClass::TheClass()
{
    arrayM.assign(matrix_type(1, 3));
}
于 2010-03-23T22:25:25.443 に答える
3

配列の初期化では、デフォルトのコンストラクターを使用します。代わりにベクトルを使用できます。

class MyClass {
    std::vector<boost::numeric::ublas::matrix<double>> vectorM;
public:
    MyClass() : vectorM(10, boost::numeric::ublas::matrix<double>(5,7)) {
    }
};
于 2010-03-23T22:31:09.050 に答える
3

何を初期化しようとしているのか正確にはわかりませんが、推測すると (arraySize エントリを持つ配列。配列内の各エントリは (1, 3) で初期化されます)、コンパイルするこれを思いつきました... .

const size_t arraySize = 3;
boost::numeric::ublas::matrix<double> arrayM[arraySize] = 
{
    boost::numeric::ublas::matrix<double>(1, 3),
    boost::numeric::ublas::matrix<double>(1, 3),
    boost::numeric::ublas::matrix<double>(1, 3)
};
于 2010-03-23T22:36:31.037 に答える
1

どうですか:

// Assume: arraySize is a constant
// Assume: #include <boost/tr1/array.hpp>

typedef boost::numeric::ublas::matrix<double> doubleMatrixT;
std::tr1::array<doubleMatrixT, arraySize> arrayM;
arrayM.assign(doubleMatrixT(1, 3));

テンプレートは、便利な関数を提供する基本的な配列のstd::tr1::array(非常に) 薄いラッパーです。たとえば、ここではassign()、配列全体を 1 つの値で埋める を使用しました。

于 2010-03-23T22:31:28.673 に答える