The nanflag parameter

4 messages
Open this post in threaded view
|
Report Content as Inappropriate

The nanflag parameter

Open this post in threaded view
|
Report Content as Inappropriate

Re: The nanflag parameter

Open this post in threaded view
|
Report Content as Inappropriate

Re: The nanflag parameter

 Hi Rik, Thank you for your reply. On Mon, Jan 16, 2017 at 2:54 AM, Rik <[hidden email]> wrote: > So, my fundamental question for Octave-Maintainers is whether we need a > nanflag in liboctave, or only in the Octave interpreter? If the performance deficit turns out to be acceptable, is there a way to also compute the index array (the second output) using high level functions? Unluckily, the find function cannot operate along a given dimension. This question also arises when calling with one output if the argument is a complex array, as NaN complex values can have regular imaginary parts and then min/max must return the first one met. For example, in MATLAB: >> max([1, NaN + 2i, NaN + 3i], [], 'includenan') ans =       NaN + 2.0000i Otherwise, as far as I can see I'd have to manually go through the array content. For NDArrays, I'd have to use an index tuple (maybe somehow simulating that the loop along dim is the innermost, in order to be able to break it at the first NaN found, unless a full but cache-friendly loop was preferably), while for Sparse(Complex)Matrix I'd operate on the three underlying vectors. Is this correct? As for the two-array-input form, there is always only one output, so a method similar to your pseudocode is enough for non-complex inputs including SparseMatrix (by using "or" instead of "any", which fortunately knows to perform broadcasting). For two complex input arrays, the current default behaviour is surprisingly equivalent to "includenan" (because of octave::math::max with complex parameters, which propagates NaN's). The following pseudocode, although tricky, is the best I could think of for the "omitnan" case of two complex inputs: tmp = __max__(x, y);  # Call old max function if (! includenan)   x_extended = x + zeros(size(y));   y_extended = y + zeros(size(x));   x_extended_isnan = isnan(x_extended); # or isnan(x) | zeros(size(y));   non_NaN_operands = ifelse(x_extended_isnan, y_extended, x_extended);   idx = xor(isnan(x), isnan(y));   tmp(idx) = non_NaN_operands(idx); endif Of course, suppose the equivalent C++ code. It also works on SparseComplexMatrices. Stefan