2016-08-28 4 views
1

Я пишу программу, которая связана с поиском реальных корней квадратичных и кубических многочленов, а так как функция roots в MATLAB для многочленов с общей степенью и вычислительно тяжелой, я выбрал такую ​​функцию из GSL Library, и я хочу MEX это и использовать его в MATLAB. Вот код:Как получить доступ к элементам матрицы, переданным функции MEX?

/* 
* 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?

ответ

0

просто

x0=mxGetPr(prhs[0]); 

mxGetPr возвращает указатель double.

Тогда вы можете получить доступ к члену x0 по

a=x0[0]; 
b=x0[1]; 
c=x0[2]; 

Если ваш тип данных отличается от double, вы можете использовать

type variable = (type *) mxGetData(prhs[0]); 
Смежные вопросы