使用C++ mex函数在matlab中获取double类型的输出
Getting output of type double in matlab using C++ mex Function
#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 输入矩阵的重构误差,我需要使用 mexFunction 在 matlab 中检索它。但仍在为如何将我的变量错误中存储的数据指向 plhs[1] 而苦苦挣扎。
看来您遗漏了两件事:
plhs[0] = mxCreateDoubleMatrix(Dim1, Dim2, mxREAL);
c 中的数组是 0 索引的,因此返回的第一个项目应该是 plhs[0]。要从您的错误中复制数据:
memcpy(mxGetPr(plhs[0]), error, Dim1*sizeof(double));
#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 输入矩阵的重构误差,我需要使用 mexFunction 在 matlab 中检索它。但仍在为如何将我的变量错误中存储的数据指向 plhs[1] 而苦苦挣扎。
看来您遗漏了两件事:
plhs[0] = mxCreateDoubleMatrix(Dim1, Dim2, mxREAL);
c 中的数组是 0 索引的,因此返回的第一个项目应该是 plhs[0]。要从您的错误中复制数据:
memcpy(mxGetPr(plhs[0]), error, Dim1*sizeof(double));