Возможно, но есть несколько вещей, о которых нужно знать.
Во-первых, тип результата сравнения не будет таким же. Результатом компонентного сравнения в Eigen будет массив целых чисел (0 или 1). Если вы хотите что-то, что может быть 0, 1 или NaN
, вам придется преобразовать его в float
. В Eigen вы должны использовать явную операцию приведения.
Обратите внимание, что, как указано в комментариях, результат не скажет вам, какая сторона неравенства имела NaN
s в первую очередь.
Теперь вы можете сделать это арифметически. Если мы преобразуем все в векторы float
, мы можем положиться на арифметические c свойства NaN
s для их распространения:
VectorXf compare_with_nans(const VectorXf& vec1, const VectorXf& vec2) {
const VectorXf zero_or_nan_1 = vec1 - vec1;
const VectorXf zero_or_nan_2 = vec2 - vec2;
const VectorXf compare = (vec1.array() < vec2.array()).matrix().cast<float>();
return compare + zero_or_nan_1 + zero_or_nan2;
}
Это зависит от того факта, что x-x
даст 0
, если x
- обычное значение, и NaN
, если x
- NaN
, поэтому vec1-vec1
будет иметь 0, где значения его компонентов являются обычными числами и NaN
везде.
С окончательным добавлением NaN
s на векторах zero_or_nan
будет загрязнять регулярные значения в строках, содержащих NaN
в исходном векторе.