C++ 在特征矩阵中,如何将多个映射矩阵组合为矩阵数组
我有一个类,它有多个映射矩阵作为成员。代码如下所示:C++ 在特征矩阵中,如何将多个映射矩阵组合为矩阵数组,c++,eigen,C++,Eigen,我有一个类,它有多个映射矩阵作为成员。代码如下所示: class MyClass { public: MyClass(int nrow, int ncol, int nmat) : arr(new int [nmat*nrow*ncol]), mat1(arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)), mat2(arr + 1, nrow, ncol, Stride<Dyn
class MyClass {
public:
MyClass(int nrow, int ncol, int nmat) :
arr(new int [nmat*nrow*ncol]),
mat1(arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)),
mat2(arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) {}
int *arr;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2;
};
int main()
{
int nmat = 2; // number of matrices
int nrow = 3; // number of rows for each matrix
int ncol = 4; // number of columns for each matrix
int arr_size = nmat*nrow*ncol; // size of the array.
MyClass A (nrow, ncol, nmat);
for (int i=0; i<arr_size; i++) {
A.arr[i] = i+1;
}
cout <<"mat1 = \n"<<A.mat1<<endl;
cout <<"mat2 = \n"<<A.mat2<<endl;
return 0;
}
它显然不起作用,因为我不能在初始值设定项列表中这样做。但要使用stride进行这种映射,我必须使用初始值设定项list。有人知道如何实现这一点吗?使用C++11,您可以做到这一点
class MyClass {
public:
MyClass(int* arr, int nrow, int ncol, int nmat) :
mat { { arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat) },
{ arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat) } } {
std::cout << mat[1].data() - arr << std::endl;
std::cout << mat[1].rows() << std::endl;
std::cout << mat[1].cols() << std::endl;
std::cout << mat[1].innerStride() << std::endl;
std::cout << mat[1].outerStride() << std::endl;
}
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat[2];
};
class-MyClass{
公众:
MyClass(int*arr、int nrow、int ncol、int nmat):
mat{{arr,nrow,ncol,Stride(nrow*nmat,nmat)},
{arr+1,nrow,ncol,Stride(nrow*nmat,nmat)}{
std::我是否可以尝试此操作并得到“错误:错误的数组初始值设定项”
。这可能是编译器的问题吗?我使用的g++4.4.7带有标志-std=c++0x
。它太旧了。请至少尝试4.9次。谢谢,一旦我们的计算机系统管理员今天发布了较新版本的gcc
,我就会尝试。接下来的问题是,如果我希望矩阵的数量为nmat
,而不是 2
?有没有办法在初始值设定项列表中为
循环引入一个?没有办法。动态构建映射会更好。我已经使用gcc 4.9.2对它进行了测试,它正在工作。谢谢!
class MyClass {
public:
MyClass(int* arr, int nrow, int ncol, int nmat) :
mat { { arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat) },
{ arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat) } } {
std::cout << mat[1].data() - arr << std::endl;
std::cout << mat[1].rows() << std::endl;
std::cout << mat[1].cols() << std::endl;
std::cout << mat[1].innerStride() << std::endl;
std::cout << mat[1].outerStride() << std::endl;
}
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat[2];
};