У меня есть класс, который имеет несколько отображенных матриц в качестве членов. Код показан ниже:В 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<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;
}
Теперь я хочу, чтобы mat1
и mat2
быть массивом из двух Matrics как mat[0]
и mat[1]
. Я пытался сделать что-то вроде этого:
class MyClass {
public:
MyClass(int nrow, int ncol, int nmat) :
arr(new int [nmat*nrow*ncol]),
mat[0](arr, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)),
mat[1](arr + 1, nrow, ncol, Stride<Dynamic, Dynamic>(nrow * nmat, nmat)) {}
int *arr;
Map<MatrixXi, 0, Stride<Dynamic, Dynamic> > mat[2];
};
Это, очевидно, не работает, так как я не могу сделать это в списке инициализатора. Но для выполнения такого сопоставления с шагом, я должен использовать список инициализаторов. У кого-нибудь есть идея о том, как это реализовать?
Я пробовал это и получил «ошибка: неудачный инициализатор массива». Может быть, это проблема с компилятором? Я использую g ++ 4.4.7 с флагом '-std = C++ 0x'. – Yang
он слишком стар. попробуйте как минимум 4.9 – kangshiyin
Спасибо, я попробую, как только наша административная система компьютера сделает более новую версию 'gcc' доступной сегодня. Следующий вопрос будет, что, если я хочу, чтобы число матриц было 'nmat' вместо' 2'? Есть ли способ ввести цикл 'for' в список инициализаторов? – Yang