2016-07-13 2 views
1

У меня есть класс, который имеет несколько отображенных матриц в качестве членов. Код показан ниже:В 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]; 
}; 

Это, очевидно, не работает, так как я не могу сделать это в списке инициализатора. Но для выполнения такого сопоставления с шагом, я должен использовать список инициализаторов. У кого-нибудь есть идея о том, как это реализовать?

ответ

0

С 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]; 
}; 

Это должно быть случай 5 инициализации списка в следующей ссылке.

http://en.cppreference.com/w/cpp/language/list_initialization

С другой стороны, Eigen::Map это просто легкий обертки для необработанных указателей и размеров. Вы можете поставить arr, nrow, ncol и nmat в качестве членов класса и построить Eigen::Map на лету.

+0

Я пробовал это и получил «ошибка: неудачный инициализатор массива». Может быть, это проблема с компилятором? Я использую g ++ 4.4.7 с флагом '-std = C++ 0x'. – Yang

+0

он слишком стар. попробуйте как минимум 4.9 – kangshiyin

+0

Спасибо, я попробую, как только наша административная система компьютера сделает более новую версию 'gcc' доступной сегодня. Следующий вопрос будет, что, если я хочу, чтобы число матриц было 'nmat' вместо' 2'? Есть ли способ ввести цикл 'for' в список инициализаторов? – Yang

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