NLopt 目标函数如下所示:
double myfunc(const std::vector<double> &x, std::vector<double> &grad, void *my_func_data)
x 是要优化的数据,grad 是梯度向量,my_func_data 保存附加数据。
我有兴趣将犰狳矩阵 A 和 B 提供给 void *my_func_data。
我摆弄犰狳的成员函数
mat A(5,5);
mat B(5,5);
double* A_mem = A.memptr();
double* B_mem = B.memptr();
这给了我一个指向矩阵 A 和 B 的指针。我正在考虑定义另一个指向这些指针的指针:
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;
然后将 *CombineMat 作为 my_func_data 传递。
- 这是这样做的方法吗?好像很笨拙...
- 一旦通过了 CombineMat,当我在 myfunc 中时,如何将 void 类型重新转换为可用的东西?
回答
我在这里的帮助下回答了我自己的问题。
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);
一旦进入 myfunc,C 中的数据可以转换回 Armadillo 矩阵,如下所示:
mat* pC = (mat*)(my_func_data);
mat A = pC[0];
mat B = pC[1];