在 C MexFunction 中使用 Besselk 函数
Using Besselk function in C MexFunction
我想在C mexFunction中实现Matern相关函数,这需要计算第二种修改后的Besselk函数。
在 MATLAB 中,可以使用函数 besselk。但是,在任何 C 库中都没有这样的等价物(我说得对吗?我知道 boost 库(一个C++库(提供了对第二种修改后的 Besselk 函数的访问,请参阅 https://en.cppreference.com/w/cpp/experimental/special_math,但我无法让它在我的 Mac 上的 MATLAB 2018a 和 Linux 系统中使用 C mexFunction 工作。顺便说一句,我不想在 C mex 代码中调用 MATLAB 函数 besselk。
任何建议将不胜感激。下面是一个使用 C mex 代码构造母系相关函数的最小示例。
#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;
}
如果我将上面的 C mex 代码转换为C++代码文件,我可以在 mac 上成功使用 g++ 编译器编译C++代码。
#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=%lfn", corr);
return 0;
}
为了再次强调我的问题,我不需要C++代码,而是想让我的 C mex 代码成功运行。
这不是真正的墨西哥特定。
您可以使用 C 程序中的 Boost 特殊数学函数;它们旨在用于 C 或C++。
为此,您需要添加
#include <boost/math/tr1.hpp>
在C++中,此文件中的声明入到命名空间booth::math
但显然您不能在 C 代码中使用C++命名空间。函数本身是用 C 链接编译的,因此它们是全局名称,可以简单地按原样使用。
请注意,Boost 同时提供 C99 和 TR1 特殊数学函数(因此,如果您仍然生活在过去,它可以与早于 C99 的标准 C 库一起使用(,但它们可以在不同的库中找到,如 Boost 文档中所述。即使您有 C99 标准库,在包含 Boost 标头后,您也需要将 Boost 库用于 C99 函数。因此,您可能需要向构建命令添加两个链接选项:
-lboost_math_c99 -lboost_math_tr1
如果需要float
或long double
版本,则需要其他库。有关详细信息,请参阅上面的 Boost 文档链接。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 在 C MexFunction 中使用 Besselk 函数
- c#中的BesselK函数