Matlab学习历程

##双精度实数型的求和--用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");
    }
    //mrows = mxGetM(prhs[0]);//输入必须是非复数的双精度数;
    //mcols = mxGetN(prhs[0]);
    if (!mxIsDouble(prhs[x_in]) || mxIsComplex(prhs[x_in]))
    {
        mexErrMsgTxt("input must be a noncomplex scalar double");
    }
    //  plhs[0] = mxCreatDoubleMatrix(mrows, ncols, mxREAL);
    //x = mxGetPr(prhs[0]);//获得输入参数的指针;
    //y = mxGetPr(plhs[0]);
    //调用子程序:
    //  timetwo(y, x);//以输入参数和输出参数的指针。作为实参,
    ndims_x = mxGetNumberOfDimensions(prhs[x_in]);
    dims_x =(int *)mxGetDimensions(prhs[x_in]);

    ////mx = mxGetM(prhs[x_in]);
    ////nx = mxGetN(prhs[x_in]);
    ////my = mxGetM(prhs[y_in]);
    ////ny = mxGetN(prhs[y_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;


    //if (mx != 1 || my != 1)
    //{
    //  mexErrMsgTxt("Both input must be row vectors");
    //}
    //mz = 1;
    //nz = nx + ny - 1;
    //plhs[z_out] = mxCreatDoubleMatrix(mz, nz, mxREAL);

    //x = mxGetPr(prhs[x_in]);
    //y = mxGetPr(plhs[y_in]);
    //z = mxGetPr(plhs[z_out]);

    //dv_convec(x, nx, y, ny, z);
    //return 0;
}

程序实现结果--在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值