1)matlab要把n++写成n=n+1
2)printf在matlab中相近功能的命令有disp(),!echo,和sprintf(),其中最后一种最接近c中的printf。有关具体用法,你可以在matlab主命令窗口输入:help sprintf 来查阅这个命令的帮助和例子。比如:sprintf('The array is %dx%d.',2,3),其输出是 The array is 2x3
3)头文件的include是不用的,因为matlab的常用库里是包含了这些函数的。顺带一提,matlab里对函数的定义,开头要用function XXX。
没有直接转换的工具,二者本质不同,matlab是解释性语言,面向的过程不同。但是matlab的语句基本上是以早期C为基础拓展的,与C的风格比较类似,会使用C的话,matlab的使用不成问题,也就是说无需转换,直接按照C的思路去编写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])
/*
warning
if
dividing
by
zero.
*/
if
(r1
==
0.0
||
r2
==
0.0
){
mexWarnMsgTxt("Division
by
zero!\n")
}
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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)