当前位置:编程学习 > VC++ >>

VC++程序转化为Matlab程序

如何转化啊?
答案:使用mex命令。但是转化函数的编写规则有一定的要求。
在matlab的安装文件\\extern\\examples\\mex有一些程序编写实例,可以仔细参考一下。以其中的yprime.c函数为例。
在matlab命令窗口执行:
mex yprime.c
会生成一个可执行的文件,可以不管他。(注意文件的路径)
然后就可以在命令窗口直接使用yprime(a%参数)函数了。与一般的函数使用没有多大差别。下面贴一下c文件编写:(在\\extern\\examples\\mex中有很多)
/*=================================================================
*
* YPRIME.C Sample .MEX file corresponding to YPRIME.M
*

Solves simple 3 body orbit problem
*
* The calling syntax is:
*
* [yp] = yprime(t, y)
*
* You may also want to look at the corresponding M-code, yprime.m.
*
* This is a MEX-file for MATLAB.
* Copyright 1984-2006 The MathWorks, Inc.
*
*=================================================================*/
/* $Revision: 1.10.6.4 $ */
#include <math.h>
#include "mex.h"

/* Input Arguments */

#define T_IN prhs[0]
#define Y_IN prhs[1]

/* Output Arguments */

#define YP_OUT plhs[0]

#if !defined(MAX)
#define MAX(A, B) ((A) > (B) ? (A) : (B))
#endif

#if !defined(MIN)
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#endif

static double mu = 1/82.45;
static double mus = 1 - 1/82.45;

static void yprime(

double yp[],

double *t,

double y[]

)
{

double r1,r2;


(void) t;
/* unused parameter */

r1 = sqrt((y[0]+mu)*(y[0]+mu) + y[2]*y[2]);

r2 = sqrt((y[0]-mus)*(y[0]-mus) + y[2]*y[2]);

/* Print warning if dividing by zero. */

if (r1 == 0.0 || r2 == 0.0 ){
mexWarnMsgTxt("Division by zero!\
");

}


yp[0] = y[1];

yp[1] = 2*y[3]+y[0]-mus*(y[0]+mu)/(r1*r1*r1)-mu*(y[0]-mus)/(r2*r2*r2);

yp[2] = y[3];

yp[3] = -2*y[1] + y[2] - mus*y[2]/(r1*r1*r1) - mu*y[2]/(r2*r2*r2);

return;
}

void mexFunction( int nlhs, mxArray *plhs[],

int nrhs, const mxArray*prhs[] )


{

double *yp;

double *t,*y;

mwSize m,n;


/* Check for proper number of arguments */


if (nrhs != 2) {
mexErrMsgTxt("Two input arguments required.");

} else if (nlhs > 1) {
mexErrMsgTxt("Too many output arguments.");

}


/* Check the dimensions of Y. Y can be 4 X 1 or 1 X 4. */


m = mxGetM(Y_IN);

n = mxGetN(Y_IN);

if (!mxIsDouble(Y_IN) || mxIsComplex(Y_IN) ||
(MAX(m,n) != 4) || (MIN(m,n) != 1)) {
mexErrMsgTxt("YPRIME requires that Y be a 4 x 1 vector.");

}


/* Create a matrix for the return argument */

YP_OUT = mxCreateDoubleMatrix(m, n, mxREAL);


/* Assign pointers to the various parameters */

yp = mxGetPr(YP_OUT);


t = mxGetPr(T_IN);

y = mxGetPr(Y_IN);



/* Do the actual computations in a subroutine */

yprime(yp,t,y);

return;

}
需要编译后,提供对应的mex文件

上一个:VC++人事系统的问题
下一个:vc++的问题,急!!!!!!!!!!!!!!!!!!!!!!!

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,