gpt4 book ai didi

armadillo - NLopt 与 Armadillo 数据

转载 作者:行者123 更新时间:2023-12-02 02:20:27 35 4
gpt4 key购买 nike

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

我摆弄了 Armadillo 的成员函数

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 类型重新转换为可用的类型?

回答

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

最佳答案

您还可以使用 Armadillo 的 Cube类(“3D 矩阵”,或三阶张量)。

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

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

关于armadillo - NLopt 与 Armadillo 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434884/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com