C++ 在C MexFunction中使用Besselk函数

C++ 在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

我想在C MEX函数中实现Matren相关函数,这需要计算第二类修改的Besselk函数

在MATLAB中,可以使用函数besselk。然而,在任何C库中都没有这样的等价物(对吗?)。我知道Boost库(C++库)提供了对第二类修改的贝塞克函数的访问,但是我在Matlab和Mac系统上用Matlab 2018A在我的C MyFax中也有困难。顺便说一句,我不想在cmex代码中调用MATLAB函数besselk

#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函数可以给出一个明确的答案。