2015-11-09 34 views
0
#define E_OUT plhs[1]  
double *E; 
double error[training_epochs]; 
double err; 

int size_err1 = mxGetM(IN_training_epochs); 
int size_err2 = mxGetN(IN_training_epochs); 

Dim1 = mxGetScalar(IN_training_epochs); 
Dim2 = 1; 
mexPrintf("Erro_Rows_numb = %d.\n", Dim1); 
mexPrintf("Error_Collums_numb = %d.\n", Dim2); 
E_OUT = mxCreateDoubleMatrix(Dim1, Dim2, mxREAL); 
E = mxGetPr(E_OUT); // getting the value of data to which E_OUT points at 

for(int epoch=0; epoch<training_epochs; epoch++) 
    { 
    err = 0; 

     for(int i=0; i<sizeTrain_X2; i++) 

     {  

    rbm.contrastive_divergence(&train_X[sizeTrain_X2*i],  learning_rate, k); 
    rbm.reconstruct(&train_X[sizeTrain_X1*i], reconstructed_X[i]); 

     for (int j=0; j< n_visible; j++) 
      {    
      err += pow(train_X[n_hidden*i+j] - reconstructed_X[i][j],2); 
      } 
     } 
      error[epoch] = err; 
     } 

從上面的代碼我已經從我的RBM輸入矩陣計算重構的誤差獲取在Matlab型雙的輸出,並且我需要使用mexFunction找回它在matlab中。但仍然在如何將存儲在我的變量錯誤中的數據指向plhs [1]。使用C++ MEX功能

+0

你想要mex函數返回什麼? –

+1

首先,C++中的數組是0索引的,所以如果你只想返回一個參數,它應該是plhs [0],而不是plhs [1]。 –

+1

是的我的壞它應該是plhs [0],我需要返回存儲在變量錯誤[紀元]中的數據,我可以從控制檯打印出來。但是因爲我對mex不是很熟悉,我不知道如何在matlab中將它作爲變量來檢索,因爲我需要得到它的一個陰謀。非常感謝你。 – JNW

回答

0

看起來你錯過兩樣東西:

plhs[0] = mxCreateDoubleMatrix(Dim1, Dim2, mxREAL); 

陣列中c的0索引所以它應該是plhs [0]的第一個項目回來。從您的錯誤中複製數據:

memcpy(mxGetPr(plhs[0]), error, Dim1*sizeof(double)); 
+0

非常感謝您的幫助,它的工作原理 – JNW

+0

還有一個問題,我認爲......一秒鐘。 checkout [用錯誤數據創建一個臨時mxArray](http://www.mathworks.com/help/matlab/matlab_external/memory-management-issues.html) 您可能需要分配一個double數組和memcpy數據。 –

+0

真的,它與上述編譯然後崩潰時,我運行它..所以我會檢查你剛纔在這裏分享的鏈接。再次感謝您的幫助。 – JNW