##双精度实数型的求和--用mexTest函数实现##
#include "mex.h"
#define x_in 0
#define y_out 0
extern int dp_sum(const int N, const double* X)
{
int i;
double sum;
sum = 0.0;
for (i = 0; i < N; i++)
{
sum += X[i];
}
return sum;
}
extern void mexTest(const int ndims_x, const int * dims_x, const double* x, double *y)
{
int incx;
double* temp;
int i, j, k;
incx = 1;
temp = (double*)mxCalloc(dims_x[0], sizeof(double));
if (ndims_x == 2)
{
if (dims_x[0] == 1)
{
y[0] = dp_sum(dims_x[1], x);
}
else
if (dims_x[1] == 1)
{
y[0] = dp_sum(dims_x[0], x);
}
else
{
for (j = 0; j < dims_x[1]; j++)
{
for (i = 0; i < dims_x[0]; i++)
{
temp[i] = x[i + dims_x[0]];
}
y[j] = dp_sum(dims_x[0], temp);
}
}
}
else
if (ndims_x == 3)
{
for (k = 0; k < dims_x[2]; k++)
{
for (j = 0; j < dims_x[1]; j++)
{
for (i = 0; i < dims_x[0]; i++)
{
temp[i] = x[i + j*dims_x[0] + k*dims_x[1] * dims_x[0]];
}
y[j +k*dims_x[1]] = dp_sum(dims_x[0], temp);
}
}
}
mxFree(temp);
}
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
mxArray *prhs[]
)
{
double *x, *y;
int ndims_x, ndims_y;
int* dims_x;
int * dims_y;
int mx, my, nx, ny;
if (nrhs != 1)
{
mexErrMsgTxt("two put requied");
}
else
if (nlhs > 1)
{
mexErrMsgTxt(" too many output argument");
}
if (!mxIsDouble(prhs[x_in]) || mxIsComplex(prhs[x_in]))
{
mexErrMsgTxt("input must be a noncomplex scalar double");
}
ndims_x = mxGetNumberOfDimensions(prhs[x_in]);
dims_x =(int *)mxGetDimensions(prhs[x_in]);
ndims_y = ndims_x;
dims_y = (int *)mxCalloc(ndims_y, sizeof(int));
if (ndims_y == 2)
{
mx = mxGetM(prhs[x_in]);
nx = mxGetN(prhs[x_in]);
if (mx == 1 || nx == 1)
{
my = 1;
ny = 1;
}
else
{
my = 1;
ny = nx;
}
dims_y[0] = my;
dims_y[1] = ny;
}
else
if (ndims_y == 3)
{
dims_y[0] = 1;
dims_y[1] = dims_x[1];
dims_y[2] = dims_x[2];
}
plhs[y_out] = mxCreateNumericArray(ndims_y,dims_y, mxDOUBLE_CLASS, mxREAL);
x = mxGetPr(prhs[x_in]);
y = mxGetPr(plhs[y_out]);
mexTest(ndims_x, dims_x, x, y);
return;
}
程序实现结果--在Matlab中编译
## 编译 ##
>> mex mexTest.cpp
Building with 'Microsoft Visual C++ 2013 Professional'.
MEX completed successfully.
## 1)行向量测试: ##
>> clear all
>> x=rand(1,4);
>> y1=sum(x)
y1 =
1.5553
>> y2=mexTest(x)
y2 =
1
## 2)列向量测试: ##
>> clear all
>> x=rand(4,1);
>> y1=sum(x)
y1 =
2.3847
>> y2=mexTest(x)
y2 =
2
##3)矩阵测试:##
>> clear all
>> x=rand(4,4);
>> y1=sum(x)
y1 =
3.0892 2.4746 2.5718 1.5645
>> y2=mexTest(x)
y2 =
2 2 2 2
##4)三维阵列测试:##
>> clear all
>> x=rand(4,4);
>> y1=sum(x)
y1 =
3.0892 2.4746 2.5718 1.5645
>> y2=mexTest(x)
y2 =
2 2 2 2