Лучший способ обработки NaN в MATLAB / MEX

Я использую решатели LAPACK библиотек в MATLAB MEX файле для решения линейной системы уравнений. В некоторых случаях система, которую я решаю, является сингулярной. Например, для одного из моих случаев система выглядит следующим образом:

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 указанной выше системы как NaN, подобное MATLAB?


person AFPP    schedule 24.06.2014    source источник


Ответы (1)


Вот пример создания числового вектора, заполненного NaNs, из MEX-функции:

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
person Amro    schedule 24.06.2014
comment
Спасибо. В качестве побочного вопроса, как бы это было сделано, если бы это был чистый c++ код? - person AFPP; 25.06.2014
comment
В C ++ есть для этого стандартная функция. Вы должны понимать, что в представлении IEEE 754 с плавающей запятой , существует множество значений, обозначающих NaN (не уникальных): stackoverflow.com/a/20723890/97160 - person Amro; 25.06.2014
comment
@ A2009 В <limits> также есть std::numeric_limits<T>::quiet_NaN(). - person chappjc; 25.06.2014
comment
@chappjc: обратите внимание на фразу Only meaningful if std::numeric_limits<T>::has_quiet_NaN == true, так что есть шанс (очень крошечный!), что функция не будет работать для некоторых платформ / реализаций: stackoverflow.com/a/16691798/97160 - person Amro; 25.06.2014
comment
@Amro Хотя has_quiet_NaN действительно проверяет, что ваша система полностью поддерживает стандарт IEEE 754 (вероятность того, что это не так уж и мало ), Я думаю, что его основная цель - обрабатывать целые типы. Поскольку numeric_limits<T> является классом-шаблоном, ничто не мешает пользователю запросить std::numeric_limits<int>::quiet_NaN(). Что это вообще могло значить, правда? Тем не менее, у VC10 нет проблем с его компиляцией. По крайней мере, у них хватило ума выделить этот случай и вернуть 0. В любом случае, у cmath функций такой проблемы нет. - person chappjc; 25.06.2014
comment
Я только что заметил, что возвращаемое значение для std::nan - это тихий Значение NaN ... или ноль, если реализация не поддерживает тихие NaN. Таким образом, похоже, что они, вероятно, делают то же самое в одной и той же системе. :) - person chappjc; 25.06.2014