我基于一个相当复杂的数学算法构建了一个程序。在这个我想要考虑具有缺失值的向量,所以NaN。到目前为止,我通过使用两个向量实现了这两个向量 - 都使用breeze的DenseVector[Double]
实现:包含实际值的向量location
和向量evidence
,其中1.0
表示值存在,值0.0
表示值不存在。有了这个,我可以这样做:
val ones = DenseVector.ones[Double](one.evidence.length)
val derivedLocation = one.evidence :* one.location :+ ((ones :- one.evidence) :* two.evidence :* two.location)
另一个例子是:
val firstnewvector = myothervector(evidence :== 1.0)
val secondnewvector = myothervector(evidence :== 0.0)
但我还有其他一些例子,其中我确实需要0而不是NaN:
def gradientAt: DenseVector[Double] =
(one.location - two.location) :* evidence :* othervalue
为了论证,这个例子已经简化了。我正在考虑放弃evidence
并使用没有具体值的NaN,但我不确定这是否是个好主意。我认为实施上述线路可能已经比较困难了,不是吗?另外,我不确定性能。 DenseVector
由包含Java原语的数组支持,并且如果我没有弄错的话,可以防止慢速自动装箱。使用Double.NaN
可能需要类而不是原语,并且可能会降低整个程序的速度并降低内存成本 - 是吗? (速度和记忆力一般都是个问题。)
所以:在我的情况下,使用Double.NaN
或考虑1)良好的代码和2)性能(内存和速度)是不是一个好主意?