C++ 在C MexFunction中使用Besselk函数
我想在C MEX函数中实现Matren相关函数,这需要计算第二类修改的Besselk函数 在MATLAB中,可以使用函数besselk。然而,在任何C库中都没有这样的等价物(对吗?)。我知道Boost库(C++库)提供了对第二类修改的贝塞克函数的访问,但是我在Matlab和Mac系统上用Matlab 2018A在我的C MyFax中也有困难。顺便说一句,我不想在cmex代码中调用MATLAB函数besselkC++ 在C MexFunction中使用Besselk函数,c++,c,matlab,mex,bessel-functions,C++,C,Matlab,Mex,Bessel Functions,我想在C MEX函数中实现Matren相关函数,这需要计算第二类修改的Besselk函数 在MATLAB中,可以使用函数besselk。然而,在任何C库中都没有这样的等价物(对吗?)。我知道Boost库(C++库)提供了对第二类修改的贝塞克函数的访问,但是我在Matlab和Mac系统上用Matlab 2018A在我的C MyFax中也有困难。顺便说一句,我不想在cmex代码中调用MATLAB函数besselk #include "mex.h" #include "matrix.h" #inclu
#include "mex.h"
#include "matrix.h"
#include <math.h>
//#include <boost/math/special_functions.hpp>
double matern(double h, double nu)
{
double tau = sqrt(2.0*nu) * h;
double c = 0.0;
if(h>0.0){
c = (pow(tau, nu) * pow(2.0, 1.0-nu) / tgamma(nu)) * boost::math::cyl_bessel_k(nu, tau);
}else{
c = 1.0;
}
return c;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if(nrhs!=2){
mexErrMsgTxt("Two Inputs are required.");
}
double h = mxGetScalar(prhs[0]);
double nu = mxGetScalar(prhs[1]);
double corr = matern(h, nu);
mexPrint("matern(h=%g, nu=%g) = %g", h, nu, corr);
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
mxSetPr(plhs[0], &corr);
return;
}
如有任何建议,将不胜感激。下面是一个用cmex代码构造matern相关函数的最小示例
#include "mex.h"
#include "matrix.h"
#include <math.h>
//#include <boost/math/special_functions.hpp>
double matern(double h, double nu)
{
double tau = sqrt(2.0*nu) * h;
double c = 0.0;
if(h>0.0){
c = (pow(tau, nu) * pow(2.0, 1.0-nu) / tgamma(nu)) * boost::math::cyl_bessel_k(nu, tau);
}else{
c = 1.0;
}
return c;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if(nrhs!=2){
mexErrMsgTxt("Two Inputs are required.");
}
double h = mxGetScalar(prhs[0]);
double nu = mxGetScalar(prhs[1]);
double corr = matern(h, nu);
mexPrint("matern(h=%g, nu=%g) = %g", h, nu, corr);
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
mxSetPr(plhs[0], &corr);
return;
}
#包括“mex.h”
#包括“矩阵h”
#包括
//#包括
双材料(双h,双nu)
{
双τ=sqrt(2.0*nu)*h;
双c=0.0;
如果(h>0.0){
c=(功率tau,nu)*功率(2.0,1.0-nu)/tgamma(nu))*boost::math::cyl_bessel_k(nu,tau);
}否则{
c=1.0;
}
返回c;
}
void MEX函数(int nlhs、mxArray*plhs[]、int nrhs、const mxArray*prhs[])
{
如果(nrhs!=2){
MEXERMSGSTXT(“需要两个输入”);
}
双h=mxGetScalar(prhs[0]);
双nu=mxGetScalar(prhs[1]);
双corr=材料(h,nu);
mexPrint(“材料(h=%g,nu=%g)=%g”,h,nu,corr);
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
mxSetPr(plhs[0],&corr);
返回;
}
<>如果将上面的C MEX代码翻译成C++代码文件,就可以成功地在GMAC上编译出G++编译器的C++代码。p>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <boost/math/special_functions.hpp>
double matern(const double h, const double nu)
{
double tau = sqrt(2.0*nu) * h;
double c = 0.0;
if(h>0.0){
c = (pow(tau, nu) * pow(2.0, 1.0-nu) / tgamma(nu)) * boost::math::cyl_bessel_k(nu, tau);
}else{
c = 1.0;
}
return c;
}
int main(){
double nu=0.5, h=1.0;
double corr = matern(h, nu);
printf("corr=%lf\n", corr);
return 0;
}
#包括
#包括
#包括
#包括
双材料(常数双h,常数双nu)
{
双τ=sqrt(2.0*nu)*h;
双c=0.0;
如果(h>0.0){
c=(功率tau,nu)*功率(2.0,1.0-nu)/tgamma(nu))*boost::math::cyl_bessel_k(nu,tau);
}否则{
c=1.0;
}
返回c;
}
int main(){
双nu=0.5,h=1.0;
双corr=材料(h,nu);
printf(“corr=%lf\n”,corr);
返回0;
}
再次强调我的问题,我不需要C++代码,相反,我想让我的C MEX代码成功运行。
< P>这不是真正的MEX特定的。 可以使用C程序中的Boost特殊数学函数;它们被设计用于C或C++中。 为此,您需要添加#include <boost/math/tr1.hpp>
如果您需要
float
或long double
版本,则需要其他库。参见上面的链接,详细介绍了Boost文档。我想你已经说过,你可以用你知道如何生产的C++代码计算你想要的结果。那有什么问题?当然不像需要声明这样一个函数来实现C链接那么简单吗?嗨@JohnBollinger,我已经详细阐述了我的帖子。我想做的是让我的C-mex代码成功运行。你好@rici,谢谢你的建议。我试图在我的cmex代码中包含这一点,但它仍然不起作用。还有什么建议吗?我还是不明白。您似乎已经拥有了所需的所有部件。事实上你知道C++中的“C链接”是什么意思吗?你不知道这对你的问题有什么影响吗?有什么理由不适用吗?嗨@JohnBollinger,据我所知,MATLAB不支持这种功能,因为MathWork没有这样的官方文档。也许在MATLAB中学习C/C++Mex函数可以给出一个明确的答案。