gpt4 book ai didi

c++ - 使用 mex 文件时 libmwm_interpreter.so 中的 matlab 浮点异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:43 26 4
gpt4 key购买 nike

我为 MATLAB 开发了一个 MEX 文件,我在 ode45 求解器中使用它。

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
//enable floating point exception
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);

size_t mrows,ncols;

/* Check for proper number of arguments. */
if(nrhs!=4) {
mexErrMsgIdAndTxt( "HYPRO:invalidNumInputs",
"4 input required.");
}
if(nlhs>2) {
mexErrMsgIdAndTxt( "HYPRO:invalidNumOutputs",
"Too many output arguments");
}

/* The input must be a noncomplex scalar double.*/
for(int i=0;i<nrhs;i++){
mrows = mxGetM(prhs[i]);
ncols = mxGetN(prhs[i]);
if( !mxIsDouble(prhs[i]) || mxIsComplex(prhs[i]) ||
!(mrows==1 && ncols==1) ) {
mexErrMsgIdAndTxt( "HYPRO:inputNotRealScalarDouble",
"Input must be a noncomplex scalar double.");
}
}

/* Create matrix for the return argument. */
plhs[0] = mxCreateDoubleMatrix((mwSize)mrows, (mwSize)ncols, mxREAL);

/* Assign pointers to each input and output. */
const double t = *mxGetPr(prhs[0]);
const double p = *mxGetPr(prhs[1]);
const double T = *mxGetPr(prhs[2]);
const double U = *mxGetPr(prhs[3]);
double& Thrust1 = *mxGetPr(plhs[0]);
Thrust1 = 9000;
double Thrust;
Foam::List<double> Mfr;

try{
MyFunction(t,p,T,U,Thrust,Mfr);
}catch (std::exception& e){
mexErrMsgIdAndTxt( "HYPRO:error", e.what());
}

plhs[1] = mxCreateDoubleMatrix((mwSize)mrows, Mfr.size(), mxREAL);
double* point = mxGetPr(plhs[1]);
for (mwSize i = 0; i < Mfr.size(); i++) {
point[i] = 40; //Mfr[i];
}
}

如您在上面的代码中所见,我将 MEX 文件的输出与 MyFunction 的输出分离,以排除其中的任何问题,但行为如下。

MEX 文件在从 MATLAB 手动调用时以及在非常简单的 for 循环中运行良好。但是,当我通过一个函数调用 ode45 求解器时,该函数又调用此 MEX 文件,我收到以下错误。

有趣的是,ode45 第一次调用 MEX 文件时不会发生错误,但会在第二次发生。

在 gdb 中调试时会产生相同的行为,但是没有可用的调试信息,因为 MATLAB 解释器的源代码不可用。

我的 Matlab 版本是 R2013a(8.1.0.604) 64-Bit(glnxa64)

MATLAB 崩溃文件:/home/trb12187/matlab_crash_dump.11254-1:

------------------------------------------------------------------------
Floating point exception detected at Mon Sep 8 12:14:25 2014
------------------------------------------------------------------------

Configuration:
Crash Decoding : Disabled
Current Visual : 0x21 (class 4, depth 24)
Default Encoding : UTF-8
GNU C Library : 2.19 stable
MATLAB Architecture: glnxa64
MATLAB Root : /usr/local/MATLAB/R2013a
MATLAB Version : 8.1.0.604 (R2013a)
Operating System : Linux 3.13.0-35-generic #62-Ubuntu SMP Fri Aug 15 01:58:42 UTC 2014 x86_64
Processor ID : x86 Family 6 Model 30 Stepping 5, GenuineIntel
Virtual Machine : Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) 64-Bit Server VM mixed mode
Window System : The X.Org Foundation (11501000), display :0

Fault Count: 1

Abnormal termination:
Floating point exception

Register State (from fault):
RAX = 0000000000000001 RBX = 00007fb110dda810
RCX = 0000000000000000 RDX = 00007fb072653d70
RSP = 00007fb110dda6c0 RBP = 00007fb110dda700
RSI = 0000000000000001 RDI = 00007fb110dda810
R8 = 0000000000000064 R9 = 0000000000000064
R10 = 0000000000200000 R11 = 0000000000400000
R12 = 0000000000000001 R13 = 00007fb072653d70
R14 = 0000000000000000 R15 = 0000000000004000
RIP = 00007fb123efeb2c EFL = 0000000000010246
CS = 0033 FS = 0000 GS = 0000

Stack Trace (from fault):
[ 0] 0x00007fb123efeb2c /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04434732
[ 1] 0x00007fb123efe875 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04434037
[ 2] 0x00007fb123f02645 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04449861
[ 3] 0x00007fb123eecfd7 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04362199
[ 4] 0x00007fb123eed950 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04364624
[ 5] 0x00007fb123f347ec /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04655084
[ 6] 0x00007fb123ef132f /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04379439
[ 7] 0x00007fb123e7e204 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+03908100
[ 8] 0x00007fb123e80b76 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+03918710
[ 9] 0x00007fb123e80fac /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+03919788
[ 10] 0x00007fb123c9d8ac /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01939628
[ 11] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 12] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 13] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 14] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
_ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 15] 0x00007fb123ce8256 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02245206
[ 16] 0x00007fb123c98a86 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01919622
[ 17] 0x00007fb123c9d374 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01938292
[ 18] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 19] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 20] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 21] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
_ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 22] 0x00007fb11b0f453a /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01672506
[ 23] 0x00007fb11b09513a /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01282362
[ 24] 0x00007fb11b0953be /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01283006
[ 25] 0x00007fb11b09712c /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01290540
[ 26] 0x00007fb11b181f17 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+02252567
[ 27] 0x00007fb1243fcaf8 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00244472
_ZN13Mfh_MATLAB_fn11dispatch_fhEiPP11mxArray_tagiS2_+00000488
[ 28] 0x00007fb123ce7d33 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02243891
[ 29] 0x00007fb123cf7798 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02307992
[ 30] 0x00007fb123cfb436 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02323510
[ 31] 0x00007fb123cfc54c /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02327884
[ 32] 0x00007fb123c7eb06 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01813254
[ 33] 0x00007fb123c75f28 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01777448
[ 34] 0x00007fb123c9e136 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01941814
[ 35] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 36] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 37] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 38] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
_ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 39] 0x00007fb123ce8256 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02245206
[ 40] 0x00007fb123c7409d /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01769629
[ 41] 0x00007fb123c9cb0e /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01936142
[ 42] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 43] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 44] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 45] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
_ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 46] 0x00007fb123cd4dcb /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02166219
[ 47] 0x00007fb123c927cc /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01894348
[ 48] 0x00007fb123c8ee1d /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01879581
[ 49] 0x00007fb123c8f255 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01880661
[ 50] 0x00007fb11ad44fae /usr/local/MATLAB/R2013a/bin/glnxa64/libmwbridge.so+00139182
[ 51] 0x00007fb11ad45111 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwbridge.so+00139537
[ 52] 0x00007fb11ad45ce5 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwbridge.so+00142565
_Z8mnParserv+00000725
[ 53] 0x00007fb1246e23d2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00447442
_ZN11mcrInstance30mnParser_on_interpreter_threadEv+00000034
[ 54] 0x00007fb1246c19ac /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00313772
[ 55] 0x00007fb1246c1b88 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00314248
[ 56] 0x00007fb1182595c6 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwuix.so+00480710
[ 57] 0x00007fb118266df2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwuix.so+00536050
[ 58] 0x00007fb124dac862 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwservices.so+01845346
[ 59] 0x00007fb124dad50f /usr/local/MATLAB/R2013a/bin/glnxa64/libmwservices.so+01848591
_Z25svWS_ProcessPendingEventsiib+00001615
[ 60] 0x00007fb1246c25ef /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00316911
[ 61] 0x00007fb1246c2f5c /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00319324
[ 62] 0x00007fb1246bc592 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00292242
[ 63] 0x00007fb122850182 /lib/x86_64-linux-gnu/libpthread.so.0+00033154
[ 64] 0x00007fb12257cfbd /lib/x86_64-linux-gnu/libc.so.6+01028029 clone+00000109

感谢您的帮助,如果您需要发布更多详细信息,请告诉我。亚历山德罗

最佳答案

我找到了问题所在,可能只是 Stackoverflow 的积极影响对我来说就足够了。基本上问题在于浮点异常的启用:feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); 注释掉这一行解决了这个问题。可能这也影响了 MATLAB 解释器的行为,它无法像往常一样处理浮点异常。为了在我的函数中启用浮点异常(我不希望 nan 通过我的代码传播)我在调用 MyFunction 之前和之后启用然后禁用浮点异常,所以最后mex 文件的工作版本是:

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

size_t mrows,ncols;

/* Check for proper number of arguments. */
if(nrhs!=4) {
mexErrMsgIdAndTxt( "HYPRO:invalidNumInputs",
"4 input required.");
}
if(nlhs>2) {
mexErrMsgIdAndTxt( "HYPRO:invalidNumOutputs",
"Too many output arguments");
}

/* The input must be a noncomplex scalar double.*/
for(int i=0;i<nrhs;i++){
mrows = mxGetM(prhs[i]);
ncols = mxGetN(prhs[i]);
if( !mxIsDouble(prhs[i]) || mxIsComplex(prhs[i]) ||
!(mrows==1 && ncols==1) ) {
mexErrMsgIdAndTxt( "HYPRO:inputNotRealScalarDouble",
"Input must be a noncomplex scalar double.");
}
}

/* Create matrix for the return argument. */
plhs[0] = mxCreateDoubleMatrix((mwSize)mrows, (mwSize)ncols, mxREAL);

/* Assign pointers to each input and output. */
const double t = *mxGetPr(prhs[0]);
const double p = *mxGetPr(prhs[1]);
const double T = *mxGetPr(prhs[2]);
const double U = *mxGetPr(prhs[3]);

double& Thrust = *mxGetPr(plhs[0]);
Foam::List<double> Mfr;

try{
//enable floating point exception
//it has to be disabled when exiting from this function!!
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
MyFunction(t,p,T,U,Thrust,Mfr);
fedisableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
}catch (std::exception& e){
mexErrMsgIdAndTxt( "HYPRO:error", e.what());
}

plhs[1] = mxCreateDoubleMatrix((mwSize)mrows, Mfr.size(), mxREAL);
double* point = mxGetPr(plhs[1]);
for (mwSize i = 0; i < Mfr.size(); i++) {
point[i] = Mfr[i];
}
}

非常感谢您的关注,希望这对其他人有帮助。

亚历山德罗

关于c++ - 使用 mex 文件时 libmwm_interpreter.so 中的 matlab 浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25723374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com