配列が 2 次元の場合、格納順序に注意する必要があります。デフォルトでは、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 配列へ
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
です。