如何创建一个boost矩阵数组?

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

谢谢,Ravi。
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,请考虑使用 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)) {
    }
};

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

哇,你比我早了2秒钟发布了完全相同的内容。我很惊讶。这是一个好链接来解释它,我会删除我的答案:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5。 - Brendan Long

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(),它可以用单个值填充整个数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接