如何访问传递给 MEX 函数的矩阵成员?
How to access members of the matrix passed to a MEX function?
我正在编写一个程序,涉及寻找二次和三次多项式的实根,因为 MATLAB 中的 roots
函数适用于具有一般次数和计算量大的多项式,所以我选择了这样的函数来自 GSL Library,我想对其进行 MEX 处理并在 MATLAB 中使用它。这是代码:
/*
* mx_solve_quadratic.cpp
*
* Solves for real roots of the standard quadratic equation
*
* The calling syntax is:
*
* rootsMatrix = mx_solve_quadratic(coefficientsMatrix)
*
* This is a MEX file for MATLAB.
*/
#include <config.h>
#include <math.h>
#include "mex.h"
#include "matrix.h"
int gsl_poly_solve_quadratic (double , double , double , double *, double *)
/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double a; /* coefficient for x^2 */
double b; /* coefficient for x */
double c; /* coefficient for 1 */
double *x0 /* pointer to the smaller root */
double *x1 /* pointer to the bigger root */
mxGetData(prhs[0])
}
int gsl_poly_solve_quadratic (double a, double b, double c, double *x0, double *x1)
{
if (a == 0) /* Handle linear case */
{
if (b == 0)
{
return 0;
}
else
{
*x0 = -c / b;
return 1;
};
}
{
double disc = b * b - 4 * a * c;
if (disc > 0)
{
if (b == 0)
{
double r = sqrt (-c / a);
*x0 = -r;
*x1 = r;
}
else
{
double sgnb = (b > 0 ? 1 : -1);
double temp = -0.5 * (b + sgnb * sqrt (disc));
double r1 = temp / a ;
double r2 = c / temp ;
if (r1 < r2)
{
*x0 = r1 ;
*x1 = r2 ;
}
else
{
*x0 = r2 ;
*x1 = r1 ;
}
}
return 2;
}
else if (disc == 0)
{
*x0 = -0.5 * b / a ;
*x1 = -0.5 * b / a ;
return 2 ;
}
else
{
return 0;
}
}
}
因为单类型矩阵被传递给 MEX 函数,prhs
是一个只有一个成员的 mxArray,这是一个有 3 个成员的矩阵。
我通过 mxGetData(prhs[0])
得到这个矩阵,但我不知道如何访问矩阵内的成员并得到 a
、b
、c
?
简直
x0=mxGetPr(prhs[0]);
mxGetPr
returns double
指针。
然后您可以通过
访问x0
的成员
a=x0[0];
b=x0[1];
c=x0[2];
如果你的数据类型不同于double
,你可以使用
type variable = (type *) mxGetData(prhs[0]);
我正在编写一个程序,涉及寻找二次和三次多项式的实根,因为 MATLAB 中的 roots
函数适用于具有一般次数和计算量大的多项式,所以我选择了这样的函数来自 GSL Library,我想对其进行 MEX 处理并在 MATLAB 中使用它。这是代码:
/*
* mx_solve_quadratic.cpp
*
* Solves for real roots of the standard quadratic equation
*
* The calling syntax is:
*
* rootsMatrix = mx_solve_quadratic(coefficientsMatrix)
*
* This is a MEX file for MATLAB.
*/
#include <config.h>
#include <math.h>
#include "mex.h"
#include "matrix.h"
int gsl_poly_solve_quadratic (double , double , double , double *, double *)
/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double a; /* coefficient for x^2 */
double b; /* coefficient for x */
double c; /* coefficient for 1 */
double *x0 /* pointer to the smaller root */
double *x1 /* pointer to the bigger root */
mxGetData(prhs[0])
}
int gsl_poly_solve_quadratic (double a, double b, double c, double *x0, double *x1)
{
if (a == 0) /* Handle linear case */
{
if (b == 0)
{
return 0;
}
else
{
*x0 = -c / b;
return 1;
};
}
{
double disc = b * b - 4 * a * c;
if (disc > 0)
{
if (b == 0)
{
double r = sqrt (-c / a);
*x0 = -r;
*x1 = r;
}
else
{
double sgnb = (b > 0 ? 1 : -1);
double temp = -0.5 * (b + sgnb * sqrt (disc));
double r1 = temp / a ;
double r2 = c / temp ;
if (r1 < r2)
{
*x0 = r1 ;
*x1 = r2 ;
}
else
{
*x0 = r2 ;
*x1 = r1 ;
}
}
return 2;
}
else if (disc == 0)
{
*x0 = -0.5 * b / a ;
*x1 = -0.5 * b / a ;
return 2 ;
}
else
{
return 0;
}
}
}
因为单类型矩阵被传递给 MEX 函数,prhs
是一个只有一个成员的 mxArray,这是一个有 3 个成员的矩阵。
我通过 mxGetData(prhs[0])
得到这个矩阵,但我不知道如何访问矩阵内的成员并得到 a
、b
、c
?
简直
x0=mxGetPr(prhs[0]);
mxGetPr
returns double
指针。
然后您可以通过
访问x0
的成员
a=x0[0];
b=x0[1];
c=x0[2];
如果你的数据类型不同于double
,你可以使用
type variable = (type *) mxGetData(prhs[0]);