NLopt com dados do tatu
A função objetivo NLopt é assim:
double myfunc(const std::vector<double> &x, std::vector<double> &grad, void *my_func_data)
x estão sendo otimizados, grad é um vetor de gradientes e my_func_data contém dados adicionai
Estou interessado em fornecer as matrizes A e B do tatu para anular * my_func_data.
Eu brinquei com as funções de membro do Tatu
mat A(5,5);
mat B(5,5);
double* A_mem = A.memptr();
double* B_mem = B.memptr();
o que me dá um ponteiro para as matrizes A e B. Eu estava pensando em definir outro ponteiro para esses ponteiros:
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;
e passando * CombineMat como my_func_data.
Esta é a maneira de fazê-lo? Parece desajeitado ... Depois que o CombineMat for aprovado, como reconfigurar o tipo de void em algo utilizável quando estou dentro do meu funcionamentRESPOND
Respondi minha própria pergunta com a ajuda 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);
Uma vez dentro de myfunc, os dados em C podem ser convertidos de volta para matrizes de tatus assim:
mat* pC = (mat*)(my_func_data);
mat A = pC[0];
mat B = pC[1];