2010-03-23 6 views
3

Как определить массив матриц boost в качестве переменной-члена?Как создать массив импульсных матриц?

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

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); 

Спасибо, Рави.

ответ

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)); 
} 
3

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

class MyClass { 
    std::vector<boost::numeric::ublas::matrix<double>> vectorM; 
public: 
    MyClass() : vectorM(10, boost::numeric::ublas::matrix<double>(5,7)) { 
    } 
}; 
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(), который заполняет весь массив одним значением.

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) 
}; 
+0

Ничего себе. Вы отправили то же самое, что и я за 2 секунды до меня. Я впечатлен. Вот хорошая ссылка, чтобы объяснить это, и я удалю свой ответ: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5 –

Смежные вопросы