gpt4 book ai didi

c++ - 在EIGEN中单独声明并初始化一个map类型的矩阵

转载 作者:行者123 更新时间:2023-11-28 05:35:46 24 4
gpt4 key购买 nike

我正在尝试使用 Eigen:Map with Stride 将两个矩阵映射到一个数组。例如,如果

arr = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24} 

我希望映射矩阵是

mat1 = {1, 7, 13, 19;
3, 9, 15, 21;
5, 11, 17, 23}

mat2 = {2, 8, 14, 20; 
4, 10, 16, 22;
6, 12, 18, 24}

以下代码有效:

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.

int *arr = new int[arr_size];

Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1(arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2(arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));

for (int i=0; i<arr_size; i++) {
arr[i] = i+1;
}

cout <<"mat1 = \n"<<mat1<<endl;
cout <<"mat2 = \n"<<mat2<<endl;

结果是:

mat1 = 
1 7 13 19
3 9 15 21
5 11 17 23
mat2 =
2 8 14 20
4 10 16 22
6 12 18 24

但是,我想像下面的代码一样分别声明和映射矩阵:

MatrixXi mat1;
MatrixXi mat2;
new(&mat1) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
new(&mat2) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));

这会给我段错误。

如果我像下面的代码一样注释掉 mat2:

MatrixXi mat1;
// MatrixXi mat2;
new(&mat1) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));
// new(&mat2) Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > (arr+1 ,nrow, ncol, Stride<Dynamic,Dynamic>(nrow*nmat, nmat));

然后没有 Segmentation fault,但是 Stride 不工作。结果是:

mat1 = 
1 4 7 10
2 5 8 11
3 6 9 12

之所以要将声明和初始化分开,是因为我想写一个类,mat1和mat2是它的成员。

最佳答案

mat1mat2属于 Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > 类型, 但是当你单独做的时候,你将它们定义为 MatrixXi .

如果你想让他们成为一个类成员,你可以按照类成员对象的一般方式。

class MyClass {
MyClass(int* arr, int nrow, int ncol, int nmat) :
a(3), v(10),
mat1(arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)),
mat2(arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) {
}

int a;
std::vector<int> v;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat1;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat2;
};

new不需要运算符。

关于c++ - 在EIGEN中单独声明并初始化一个map类型的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38330345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com