3

NLopt目的関数は次のようになります。

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

xは最適化されるデータ、gradは勾配のベクトル、my_func_dataは追加のデータを保持します。

ボイド*my_func_dataにアルマジロ行列AとBを提供することに興味があります

アルマジロのメンバー機能をいじった

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型を使用可能なものに再キャストするにはどうすればよいですか?

答え

私はここから助けを借りて自分の質問に答えました。

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

1 に答える 1

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
于 2012-02-15T09:37:28.383 に答える