In class RealVector, the default implementation of RealMatrix outerProduct(RealVector) uses sparse iterators on the entries of the two vectors. The rationale behind this is that 0d * x == 0d is true for all double x. This assumption is in fact false, since 0d * NaN == NaN.
Proposed fix is to loop through all entries of both vectors. This can have a significant impact on the CPU cost, but robustness should probably be preferred over speed in default implementations.
Same issue occurs with double dotProduct(RealVector), which uses sparse iterators for this only.
Another option would be to through an exception if isNaN() is true, in which case caching could be used for both isNaN() and isInfinite().