【问题标题】:Best way of handling NaN in MATLAB/MEX在 MATLAB/MEX 中处理 NaN 的最佳方法
【发布时间】:2014-08-15 04:13:21
【问题描述】:

我在 MATLAB MEX 文件中使用 LAPACK 库的求解器来求解线性方程组。在某些情况下,我解决的系统是单一的。例如,对于我的一个案例,系统如下:

A =
 0.00000000 0.00000000  0.00000000
 0.00000000 0.00000000  0.00000000
 0.00000000 0.00000000  77.31867171

b:
-0.00000000 -0.00000000 -0.00000000

将上述系统的Ax=b 的解决方案标记为类似于MATLABNaN 的最佳方法是什么?

【问题讨论】:

    标签: matlab nan mex lapack


    【解决方案1】:

    下面是一个从 MEX 函数创建填充有NaNs 的数字向量的示例:

    test_nan.cpp

    #include "mex.h"
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
        plhs[0] = mxCreateDoubleMatrix(3, 1, mxREAL);
        double *x = mxGetPr(plhs[0]);
        double nanVal = mxGetNaN();
        for (int i=0; i<3; ++i) {
            x[i] = nanVal;
        }
    }
    

    MATLAB

    >> mex -largeArrayDims test_nan.cpp
    >> x = test_nan()
    x =
       NaN
       NaN
       NaN
    

    【讨论】:

    • C++ 有一个 standard function 。您必须了解的是,在 IEEE 754 floating-point 表示中,有许多值表示 NaN(不是唯一的):stackoverflow.com/a/20723890/97160
    • @A2009 在&lt;limits&gt; 中还有std::numeric_limits&lt;T&gt;::quiet_NaN()
    • @chappjc:请注意短语Only meaningful if std::numeric_limits&lt;T&gt;::has_quiet_NaN == true,因此仍有可能(非常小!)该功能不适用于某些平台/实现:stackoverflow.com/a/16691798/97160
    • @Amro 虽然has_quiet_NaN 确实会检查您的系统是否完全支持 IEEE 754 标准 (chances that it doesn't are really tiny indeed),但我认为它的主要目的是处理整数类型。因为numeric_limits&lt;T&gt; 是一个模板类,所以没有什么可以阻止用户请求std::numeric_limits&lt;int&gt;::quiet_NaN()。这甚至意味着什么,对吧?然而 VC10 编译它没有问题。至少他们有意识将这种情况专门化并返回 0。无论如何,cmath 函数没有这个问题。
    • 我刚刚注意到 return value for std::nan 是“安静的 NaN 值 ...如果实现不支持安静的 NaN,则为零。”所以,听起来他们可能在同一个系统上做同样的事情。 :)
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多