2011-12-08 87 views
3

的NLopt目標函數看起來像這樣:NLopt與犰狳數據

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

x是數據被優化,畢業是梯度的矢量,和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 as my_func_data。

  1. 是這樣做的嗎?這看起來很笨拙......
  2. 一旦CombineMat被傳遞,當我在myfunc裏面時,如何將void類型重新轉換爲可用的東西?

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中的數據可以被轉換回犰狳矩陣是這樣的:

mat* pC = (mat*)(my_func_data); 
mat A = pC[0]; 
mat B = pC[1]; 

回答

2

還可以使用犰狳的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