C MATLAB mex-未定义符号_max

C MATLAB mex-未定义符号_max,c,matlab,max,mex,undefined-symbol,C,Matlab,Max,Mex,Undefined Symbol,我试图在使用mex的MATLAB脚本中使用以下C文件 #include <math.h> #include "mex.h" #include "blas.c" static void lbidiagQR (int n, double* gamma, double* delta, double mu, double* Q, double* u, double* v) { int i, ldQ ; double tmp ; ld

我试图在使用mex的MATLAB脚本中使用以下C文件

#include <math.h>
#include "mex.h"
#include "blas.c"



static void lbidiagQR (int n, double* gamma, double* delta, double mu,
                          double* Q, double* u, double* v)
{
int i, ldQ ;
double tmp ;

ldQ  = n*2 ;
u[0] = gamma[0] ;
for (i = 0 ; i < n ; ++i)
{
    tmp = mu ;
    rotg (&u[i], &tmp, &Q[i*2],   &Q[i*2  +ldQ]) ;

    tmp = delta[i] ;
    rotg (&u[i], &tmp, &Q[i*2+1], &Q[i*2+1+ldQ]) ;

    if (i < n-1)
    {
        v[i]   = 0.0 ;
        u[i+1] = gamma [i+1] ;

        rot (&v[i], &u[i+1], Q[i*2+1], Q[i*2+1+ldQ]) ;
    }
}
}

// input arguments
#define gamma prhs[0]
#define delta prhs[1]
#define mu    prhs[2]

// output arguments
#define Q     plhs[0]
#define u     plhs[1]
#define v     plhs[2]

void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
int n ;

// check for proper number of arguments
if (nrhs != 3) mexErrMsgTxt ("lbidiagQR requires three input arguments.")  ; else
if (nlhs != 3) mexErrMsgTxt ("lbidiagQR requires three output arguments.") ;

// check the dimensions of gamma
n = max (mxGetM (gamma), mxGetN (gamma)) ;
if (min (mxGetM (gamma), mxGetN (gamma)) != 1)
    mexErrMsgTxt ("gamma must be an n-by-1 or a 1-by-n matrix.") ;

// check the dimensions of delta
if ((min (mxGetM (delta), mxGetN (delta)) != 1) ||
    (max (mxGetM (delta), mxGetN (delta)) != n))
    mexErrMsgTxt ("delta must be an n-by-1 or a 1-by-n matrix.") ;

// check the dimensions of mu
if ((mxGetM (mu) != 1) || (mxGetN (mu) != 1))
    mexErrMsgTxt ("mu must be a scalar.") ;

// create matrices for the return arguments
Q = mxCreateDoubleMatrix (n*2, 2, mxREAL) ;
u = mxCreateDoubleMatrix (n,   1, mxREAL) ;
v = mxCreateDoubleMatrix (n-1, 1, mxREAL) ;

// do the actual computations in a subroutine
lbidiagQR (n, mxGetPr (gamma), mxGetPr (delta), *mxGetPr (mu),
              mxGetPr (Q), mxGetPr (u), mxGetPr (v)) ;
}
我认为使用max()和min()的行是问题所在。环顾四周后,我发现可以使用宏将其定义为:

#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })

#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; })
定义最大值(a,b)\ ({{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\ ___uuuu(b)b=(b)的类型\ _a>\u b?\u a:\u b;}) #定义最大值(a,b)\ ({{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\ ___uuuu(b)b=(b)的类型\ _a<\u b?\u a:\u b;}) 虽然这并不能解决这个错误,但是我现在得到了一个关于在代码中重新定义宏的警告。链接错误仍然存在


我正在用MatlabR2012B运行OSX小牛(遗憾的是,考虑到整个“叮当”崩溃)。如果您能在这方面提供帮助,我将不胜感激。

我可能已经解决了这个问题

将这些定义为宏是不起作用的,尽管在我的例子中,我可以通过假设这些值是浮点值(就像它们在matlab代码中一样)来逃避。有了这些知识,我使用了math.h fmin()fmax()中的函数

这使代码可以很好地编译

再过一段时间,我将能够完全看到这是否有效,因为代码将完全可以运行

编辑:

对!!这就解决了问题。明确地知道这些值是浮动的,这使我能够在C代码中使用fmin和fmax来代替min和max来成功地编译、链接和运行


很抱歉使用此空间进行调试,但这可能对将来的用户有用。祝你有问题的未来人好运。

你定义了两次最大值,没有给出最小值的定义。呜呜。。。我现在明白了。尽管如此,我发现了一个不同的解决方案,我已经发布了。在C,C++中没有MIN/MAX函数,另一个则有STD::MIN和STD::MAX
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })

#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; })