transpuesta - matriz inversa en c++
Convierta matriz Eigen en matriz C (6)
La solución con Map above segfaults cuando lo intento (ver el comentario anterior).
En cambio, aquí hay una solución que funciona para mí, copiando los datos en un std :: vector de Eigen :: Matrix. Preasignaré espacio en el vector para almacenar el resultado del Mapa / copia.
Eigen::MatrixXf m(2, 2);
m(0, 0) = 3;
m(1, 0) = 2.5;
m(0, 1) = -1;
m(1, 1) = 0;
cout << m << "/n";
// Output:
// 3 -1
// 2.5 0
// Segfaults with this code:
//
// float* p = nullptr;
// Eigen::Map<Eigen::MatrixXf>(p, m.rows(), m.cols()) = m;
// Better code, which also copies into a std::vector:
// Note that I initialize vec with the matrix size to begin with:
std::vector<float> vec(m.size());
Eigen::Map<Eigen::MatrixXf>(vec.data(), m.rows(), m.cols()) = m;
for (const auto& x : vec)
cout << x << ", ";
cout << "/n";
// Output: 3, 2.5, -1, 0
La biblioteca Eigen puede mapear la memoria existente en matrices Eigen.
float array[3];
Map<Vector3f>(array, 3).fill(10);
int data[4] = 1, 2, 3, 4;
Matrix2i mat2x2(data);
MatrixXi mat2x2 = Map<Matrix2i>(data);
MatrixXi mat2x2 = Map<MatrixXi>(data, 2, 2);
Mi pregunta es, ¿cómo podemos obtener c array (por ejemplo, float [] a) de la propia matriz (por ejemplo, Matrix3f m)? ¿Cuál es el diseño real de la matriz propia? ¿Los datos reales están almacenados como en la matriz c normal?
Necesita usar la función de Mapa nuevamente. Vea el ejemplo aquí: http://forum.kde.org/viewtopic.php?f=74&t=95457
Para convertir el tipo de datos normal a un tipo de matriz propia
double *X; // non-NULL pointer to some data
Puede crear una matriz doble de nRows x nCols size usando la funcionalidad Map de esta manera:
MatrixXd eigenX = Map<MatrixXd>( X, nRows, nCols );
Para convertir el tipo de matriz eigen en un tipo de datos normal
MatrixXd resultEigen; // Eigen matrix with some result (non NULL!)
double *resultC; // NULL pointer <-- WRONG INFO from the site. resultC must be preallocated!
Map<MatrixXd>( resultC, resultEigen.rows(), resultEigen.cols() ) = resultEigen;
De esta forma, puedes entrar y salir de la matriz propia. Los créditos completos van a http://dovgalecs.com/blog/eigen-how-to-get-in-and-out-data-from-eigen-matrix/
Puede usar la función miembro de datos () de la clase Eigen Matrix. El diseño predeterminado es column-major, no row-major como una matriz C multidimensional (el diseño se puede elegir al crear un objeto Matrix). Para matrices dispersas, la oración anterior obviamente no se aplica.
Si la matriz es bidimensional, se debe prestar atención a la orden de almacenamiento. De manera predeterminada, Eigen almacena matrices en orden de columna principal. Sin embargo, se necesita un orden de fila mayor para la conversión directa de una matriz en una matriz Eigen. Si dichas conversiones se realizan con frecuencia en el código, podría ser útil usar un typedef
correspondiente.
using namespace Eigen;
typedef Matrix<int, Dynamic, Dynamic, RowMajor> RowMatrixXi;
Con esta definición, uno puede obtener una matriz Eigen de una matriz de una manera simple y compacta, conservando el orden de la matriz original.
Desde la matriz C hasta 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
En la dirección opuesta, los elementos de una matriz Eigen se pueden transferir directamente a una matriz estilo C mediante el uso de Map
.
Desde Eigen :: Matrix a 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
Tenga en cuenta que en este caso, la matriz original eig
no necesita almacenarse en el diseño principal de fila. Es suficiente especificar el orden de fila principal en Map
.
ComplexEigenSolver < MyMatrix > es;
complex<double> *eseig;
es.compute(H);
es.eigenvalues().transpose();
eseig=(complex<double> *)es.eigenvalues().data();