首页 > 解决方案 > 以微风向量或微风矩阵为输入的通用方法

问题描述

我正在尝试实现一种可以接受微风矢量或微风矩阵作为输入的方法。就像是

  private def updateExponentialMovingAverage[T](tau: Double, initTheta: T, theta: T): T = {
    tau * theta + (1 - tau) * initTheta
  }

然而,这引发了重载问题,我找不到合适的类型来限制 T。你有什么建议吗?

标签: scalascala-breeze

解决方案


Breezes 对大多数此类事情使用类型类。最简单的方法是使用VectorSpace类型类,但不幸的是,对于 DenseMatrices,VectorSpace 类型类在另一个导入之后被门控,我对此感到遗憾。

import breeze.linalg._
import breeze.math._
import breeze.linalg.DenseMatrix.FrobeniusInnerProductDenseMatrixSpace.space

def updateExponentialMovingAverage[T](tau: Double, initTheta: T, theta: T)(implicit vs: VectorSpace[T, Double]): T = {
   import vs._
   theta * tau + initTheta * (1 - tau)
}

scala> val dv = DenseVector.rand(3)
val dv: breeze.linalg.DenseVector[Double] = DenseVector(0.21025028035007942, 0.6257503866073217, 0.8304592391242225)

scala> updateExponentialMovingAverage(0.8, dv, dv)
val res0: breeze.linalg.DenseVector[Double] = DenseVector(0.21025028035007942, 0.6257503866073217, 0.8304592391242225)

scala> val dm = DenseMatrix.rand(3, 3)
val dm: breeze.linalg.DenseMatrix[Double] = 0.6848513069340505  0.8995141354384266   0.3889904836678608  
0.4554398871938874  0.03297082723969558  0.6708501327709948  
0.4456539828672945  0.04289112062985678  0.9679002485942578  

updateExponentialMovingAverage(0.8, dm, dm)
val res1: breeze.linalg.DenseMatrix[Double] = 0.6848513069340505  0.8995141354384266   0.3889904836678608  
0.4554398871938874  0.03297082723969558  0.6708501327709948  
0.4456539828672945  0.04289112062985678  0.9679002485942578  



推荐阅读