NLopt con datos de armadillo

La función objetivo de NLopt se ve así:

double myfunc(const std::vector<double> &x, std::vector<double> &grad, void *my_func_data)

x son los datos que se están optimizando, grad es un vector de gradientes y my_func_data contiene datos adicionales.

Estoy interesado en suministrar matrices de armadillo A y B para anular * my_func_data.

ugueteé con las funciones de miembro de Armadillo

mat A(5,5);
mat B(5,5);
double* A_mem = A.memptr();
double* B_mem = B.memptr();

que me da un puntero a las matrices A y B. Estaba pensando en definir otro puntero a estos punteros:

double** CombineMat;
int* Arow = A.n_rows; int* Acols = A.n_cols; //obtain dimensions of A
int* Brows = B.n_rows; int* Bcols = B.n_cols; // dim(B)
CombineMat[0] = A_mem; CombineMat[1] = Arows; CombineMat[2] = Acols;
CombineMat[3] = B_mem; CombineMat[4] = Brows; CombineMat[5] = Bcols;

y luego pasando * CombineMat como my_func_data.

¿Es esta la manera de hacerlo? Parece torpe ...Una vez que se aprueba CombineMat, ¿cómo se puede volver a emitir el tipo de vacío en algo utilizable cuando estoy dentro de myfunc?

RESPONDE

Respondí mi propia pregunta con ayuda deaqu.

mat A(2,2);
A << 1 << 2 << endr << 3 << 4;

mat B(2,2);
B << 5 << 6 << endr << 7 << 8;

mat C[2];
C[0] = A;
C[1] = B;

opt.set_min_objective(myfunc, &C);

Una vez dentro de myfunc, los datos en C se pueden volver a convertir en matrices de armadillo como esta:

mat* pC = (mat*)(my_func_data);
mat A = pC[0];
mat B = pC[1];

Respuestas a la pregunta(2)

Su respuesta a la pregunta