NLopt与Armadillo数据

时间:2011-12-08 17:15:23

标签: armadillo nlopt

NLopt目标函数如下所示:

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

x是正在优化的数据,grad是渐变的矢量,my_func_data包含其他数据。

我有兴趣将Armadillo矩阵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。

  1. 这是这样做的吗?看起来很笨拙......
  2. 一旦传递了CombineMat,当我进入myfunc时,如何将void类型重新转换为可用的东西?
  3. ANSWER

    我在here的帮助下回答了我自己的问题。

    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];
    

1 个答案:

答案 0 :(得分:2)

你也可以使用Armadillo的Cube类(“3D矩阵”或3阶张量)。

立方体中的每个切片只是一个矩阵。例如:

cube X(4,5,2);

mat A(4,5);
mat B(4,5);

X.slice(0) = A;  // set the individual slices
X.slice(1) = B;

mat& C = X.slice(1); // get the reference to a matrix stored in a cube