如何访问传递给MEX函数的矩阵成员

How to access members of the matrix passed to a MEX function?

本文关键字:函数 MEX 成员 何访问 访问      更新时间:2023-10-16

我正在写一个程序,涉及寻找二次多项式和三次多项式的实根,由于MATLAB中的roots函数是针对一般次多项式和计算量大的多项式,我从GSL库中选择了这样的函数,我想在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函数的是一个类型为single的矩阵,因此prhs是一个只有一个成员的mxArray,而这是一个有3个成员的矩阵。
我通过mxGetData(prhs[0])得到这个矩阵,但我不知道如何访问矩阵中的成员并得到a, b, c ?

simply

 x0=mxGetPr(prhs[0]);

mxGetPr返回double指针

则可以通过

访问x0的成员。
 a=x0[0];
 b=x0[1];
 c=x0[2];

如果您的数据类型与double不同,您可以使用

 type variable = (type *) mxGetData(prhs[0]);