微风中的证据参数问题



我试图在微风中建立一个向量的DenseMatrix。然而,我一直得到错误信息:

could not find implicit value for evidence parameter of type breeze.storage.Zero[breeze.linalg.DenseVector[Double]]

:

val som: DenseMatrix[DenseVector[Double]] = DenseMatrix.tabulate(5, 5){ (i, j) => DenseVector.rand(20)}

即使用Scala数组做类似的事情也可以:

val som = Array.tabulate(5, 5)((i, j) => DenseVector.rand(20))

我不确定是我做错了什么还是我错过了什么?老实说,我不明白错误信息在告诉我什么……我没有做足够的Scala编程来理解这个?什么是Evidence参数,我可以显式地指定它还是需要隐式地指定它?

这是因为DenseMatrix.tabulate[V]首先用零填充矩阵。因此,对于V,应该有一个类型类Zero的实例,即在我们的DenseVector[Double]的情况下。你可以自己定义,例如

implicit def denseVectorZero[V: Zero : ClassTag]: Zero[DenseVector[V]] =
new Zero(DenseVector.zeros(0))

。如果我们知道Zero对应V,那么我们就知道Zero对应DenseVector[V]

或者更简单

implicit def ev[V: ClassTag]: Zero[DenseVector[V]] = new Zero(DenseVector(Array.empty))