Как создать массив буст-матриц? - PullRequest
3 голосов
/ 24 марта 2010

Как я могу определить массив буст-матриц как переменную-член?

Ничего из следующего не сработало.

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 ]

3 голосов
/ 24 марта 2010

Мне не совсем понятно, что именно вы пытаетесь инициализировать, но, исходя из предположения (массив с записями 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)
};
3 голосов
/ 24 марта 2010

При инициализации массива используется конструктор по умолчанию. Вместо этого вы можете использовать вектор:

class MyClass {
    std::vector<boost::numeric::ublas::matrix<double>> vectorM;
public:
    MyClass() : vectorM(10, boost::numeric::ublas::matrix<double>(5,7)) {
    }
};
3 голосов
/ 24 марта 2010

Размер, который вы инициализируете, не имеет ничего общего с типом. Поэтому:

// 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, рассмотрите возможность использования 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));
}
1 голос
/ 24 марта 2010

Как насчет:

// 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(), который заполняет весь массив одним значением.

...