Если массив двумерный, нужно обратить внимание на порядок хранения.По умолчанию Eigen хранит матрицы в главном порядке столбцов.Однако порядок прямого ряда необходим для прямого преобразования массива в собственную матрицу.Если такие преобразования часто выполняются в коде, было бы полезно использовать соответствующие typedef
.
using namespace Eigen;
typedef Matrix<int, Dynamic, Dynamic, RowMajor> RowMatrixXi;
. С таким определением можно получить собственную матрицу из массива простым и компактным способом., сохраняя при этом порядок исходного массива.
Из массива C в Eigen :: Matrix
int nrow = 2, ncol = 3;
int arr[nrow][ncol] = { {1 ,2, 3}, {4, 5, 6} };
Map<RowMatrixXi> eig(&arr[0][0], nrow, ncol);
std::cout << "Eigen matrix:\n" << eig << std::endl;
// Eigen matrix:
// 1 2 3
// 4 5 6
В обратном направлении элементы собственной матрицыможет быть передан непосредственно в массив в стиле C с помощью Map
.
От Eigen :: Matrix до C array
int arr2[nrow][ncol];
Map<RowMatrixXi>(&arr2[0][0], nrow, ncol) = eig;
std::cout << "C array:\n";
for (int i = 0; i < nrow; ++i) {
for (int j = 0; j < ncol; ++j) {
std::cout << arr2[i][j] << " ";
}
std::cout << "\n";
}
// C array:
// 1 2 3
// 4 5 6
Обратите внимание, что в этом случае исходную матрицу eig
не нужно хранить в мажорной строкераскладка.Достаточно указать основной порядок строк в Map
.